加密 Ruby 解密 Java

Encrypt Ruby decrypt Java

下午好。对有人试图解密 Java 中在 Ruby 中加密的数据这一问题感兴趣。 我试图在 Ruby 中加密一个词(使用 Marshal 模块)并在 Java 中解密。如果使用了Marshal模块,是否可以转用其他语言?

这是我在 Ruby 中的测试:

let(:key) { "12345678901234567890123456789012" }
let(:str) { "Serhii" }

it "encrypt_content" do
  crypt = ActiveSupport::MessageEncryptor.new(key, cipher: 'aes-256-cbc')
  encrypted_content = crypt.encrypt_and_sign(str)
  encrypted_content
end
    

代码方法为:

def encrypt_and_sign(value, expires_at: nil, expires_in: nil, purpose: nil)
  verifier.generate(_encrypt(value, expires_at: expires_at, expires_in: expires_in, purpose: purpose))
end

def _encrypt(value, **metadata_options)
  cipher = new_cipher
  cipher.encrypt
  cipher.key = @secret

  iv = cipher.random_iv
  cipher.auth_data = "" if aead_mode?

  encrypted_data = cipher.update(Messages::Metadata.wrap(@serializer.dump(value), metadata_options))
  encrypted_data << cipher.final

  blob = "#{::Base64.strict_encode64 encrypted_data}--#{::Base64.strict_encode64 iv}"`enter code here`
  blob = "#{blob}--#{::Base64.strict_encode64 cipher.auth_tag}" if aead_mode?
  blob
end
    

解密Java为:

private static final String key = "12345678901234567890123456789012";

@SneakyThrows
public static String decrypt(String encrypted) {
    byte[] firstByte = Base64.getDecoder().decode(encrypted.replaceAll("\n", "").getBytes(StandardCharsets.UTF_8));
    String first = new String(firstByte);
    String[] parts = first.split("--");
    byte[] secondByte = Base64.getDecoder().decode(parts[0].getBytes(StandardCharsets.UTF_8));
    String second = new String(secondByte);
    String[] parts2 = second.split("--");

    byte[] encryptedData = Base64.getDecoder().decode(parts2[0].getBytes(StandardCharsets.UTF_8));

    SecretKeySpec aesKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(new byte[16]));
    byte[] result = cipher.doFinal(encryptedData);

    return new String(result);
}

public static void main(String[] args) throws Exception {
    String encrypted = "S3l0cVEybDRUM2sxU1hFMk5YVlhOa3A2VXpRNFEyZFFibTVwZVdRMVdEUlpN\n" +
            "bkkxUzBaUGNsbFJaejB0TFRWWlVtVkNVWEJXZWxselJuWkVhbFJyWlU5VmNr\n" +
            "RTlQUT09LS0yZDA5M2FhZTg0OTJjZmIyZjdiNDA0ZWVkNGU2ZmQ4NDQ1ZTM4\n" +
            "ZjIx";
    System.out.println("Decrypted: " + decrypt(encrypted));
    }
}

结果 ��'��m��Qի���� 可能是什么原因?

未指定 Ruby 生成的确切代码(我认为这是一个错误),您可以通过阅读 the source code 找到格式,尤其是这部分:

    blob = "#{::Base64.strict_encode64 encrypted_data}--#{::Base64.strict_encode64 iv}"
    blob = "#{blob}--#{::Base64.strict_encode64 cipher.auth_tag}" if aead_mode?

其中 IV 是随机 IV,使用 openssl 模块的 Cipher::new 生成。