Java 使用AES-128-CBC编码/解码时出现的问题

Java 使用AES-128-CBC编码/解码时出现的问题,java,ruby,aes,Java,Ruby,Aes,因此,基本上我有这些代码片段,希望它们产生相同的输出: require 'openssl' aes = OpenSSL::Cipher::Cipher.new("AES-128-CBC") aes.key = "aaaaaaaaaaaaaaaa" aes.iv = "aaaaaaaaaaaaaaaa" aes.encrypt encrypted = aes.update("1234567890123456") << aes.final puts encrypted.unpack('H

因此,基本上我有这些代码片段,希望它们产生相同的输出:

require 'openssl'
aes = OpenSSL::Cipher::Cipher.new("AES-128-CBC")
aes.key = "aaaaaaaaaaaaaaaa"
aes.iv = "aaaaaaaaaaaaaaaa"
aes.encrypt
encrypted = aes.update("1234567890123456") << aes.final
puts encrypted.unpack('H*').join
下面是Java代码:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
String key = "aaaaaaaaaaaaaaaa";
String textToEncryptpt = "1234567890123456";

SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(key.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(textToEncryptpt.getBytes());
System.out.println(Crypto.bytesToHex(encrypted));
印刷品:

2d3760f53b8b3dee722aed83224f418f9dd70e089ecfe9dc689147cfe0927ddb

恼人的是它几天前还在工作。。。所以我不确定发生了什么。这个代码怎么了?你看到什么异常了吗?

Ruby脚本出错了。您必须首先调用
加密
方法,然后设置
密钥
iv

require 'openssl'
aes = OpenSSL::Cipher::Cipher.new("AES-128-CBC")
aes.encrypt
aes.key = "aaaaaaaaaaaaaaaa"
aes.iv = "aaaaaaaaaaaaaaaa"
encrypted = aes.update("1234567890123456") << aes.final
puts encrypted.unpack('H*').join
需要“openssl”
aes=OpenSSL::Cipher::Cipher.new(“aes-128-CBC”)
加密
aes.key=“aaaaaaaaaaaa”
aes.iv=“aaaaaaaaaaaaaa”

encrypted=aes.update(“12345678901213456”)似乎您已经找到了脚本产生不同结果的原因

还有一些事情需要考虑:

  • 永远不要硬编码程序中的密钥-这样你就不能轻易地更改它,如果有人可以访问你的程序代码,她也可以看到密钥
  • 永远不要使用常量初始化向量。相反,生成一个随机的,并将其与密文一起发送。或者,如果你从一个密码和一些盐生成密钥,你也可以从相同的生成IV。。。但不要直接使用钥匙作为IV
  • 您的key/IV值是字符串,而不是字节
    String.getBytes()
    (在Java中)使用某种编码将字符串转换为字节。所使用的编码取决于系统,通常的字符串编码(UTF-8、拉丁语-1等)都不能将所有字节表示为可打印(和可键入)字符。如果必须将密钥存储为字符串,最好使用Base64或十六进制编码
  • 当您将字符串转换为字节时,请指定编码(稍后使用相同的编码进行检索)

@Cristian,对于密钥和初始向量,您可以使用今天的日期加上安全固定关键字来创建函数

例:钥匙=2012年1月8日+钥匙

对于初始向量

例:iv=2012年1月8日+iv

然后将该数据(键和iv)输入MD5,它将生成16个字节的输出,您可以将其用于键和iv。每天,键和iv将随机更改


确保两个系统使用相同的日期格式,并在相同的日期进行设置。

您能稍微解释一下随机生成IV的原因吗?我是说。。。我必须在服务器中加密文本,然后从Android应用程序中解密。。。如果我随机生成IV,应用程序如何知道使用了什么IV?如果你在服务器中随机生成IV,那么你必须将其与数据一起发送。(只要在您的数据已知之前不发送,发送它就没有安全风险。)您应该在设置密钥或iv之前进行加密
require 'openssl'
aes = OpenSSL::Cipher::Cipher.new("AES-128-CBC")
aes.encrypt
aes.key = "aaaaaaaaaaaaaaaa"
aes.iv = "aaaaaaaaaaaaaaaa"
encrypted = aes.update("1234567890123456") << aes.final
puts encrypted.unpack('H*').join
aescrypt.rb:13:in `final': bad decrypt (OpenSSL::Cipher::CipherError)
    from aescrypt.rb:13:in `<main>'