Ruby Ruby AES 128 cbc 的问题

spiderxu · 2014年01月14日 · 最后由 zlx_star 回复于 2016年12月12日 · 5885 次阅读

我用 java aes 加密出来的密文和 ruby 的不一样,求大神指教 java 代码

/** 
  * 加密 
  *  
  * @param content 需要加密的内容 
  * @param password  加密密码 
  * @return 
  */  
 public static byte[] encrypt(String content, String password) {  
         try {             
                 KeyGenerator kgen = KeyGenerator.getInstance("AES");  
                 kgen.init(128, new SecureRandom(password.getBytes()));  
                 SecretKey secretKey = kgen.generateKey();  
                 byte[] enCodeFormat = secretKey.getEncoded();  
                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");  
                 Cipher cipher = Cipher.getInstance("AES");// 创建密码器  
                 byte[] byteContent = content.getBytes("utf-8");  
                 cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化  
                 byte[] result = cipher.doFinal(byteContent);  
                 return result; // 加密  
         } catch (NoSuchAlgorithmException e) {  
                 e.printStackTrace();  
         } catch (NoSuchPaddingException e) {  
                 e.printStackTrace();  
         } catch (InvalidKeyException e) {  
                 e.printStackTrace();  
         } catch (UnsupportedEncodingException e) {  
                 e.printStackTrace();  
         } catch (IllegalBlockSizeException e) {  
                 e.printStackTrace();  
         } catch (BadPaddingException e) {  
                 e.printStackTrace();  
         }  
         return null;  
 }  

ruby 代码

def self.aes128_encrypt(password,content)
  aes = OpenSSL::Cipher.new('AES-128-CBC')
  aes.encrypt
  aes.key = password
  (aes.update(content) + aes.final).unpack('H*').join
end

两个加密出来的数据不一样,求指教

java 代码里的 password 不是 key, key 是用 SecureRandom 的默认算法,以 password 为随机数种子算出来的...

#1 楼 @luikore 额,大神,求指教,ruby 应该要怎么操作。

#2 楼 @spiderxu 把 java 代码里用随机数那段去掉,然后自己把 password 补 0 到 128

用相同的算法生成 Key 就行了,128 位可以使用 MD5 对密码求个摘要就行了。

#3 楼 @luikore 真的太感谢了,问题解决了。

#4 楼 @SErHo 确实要这样,现在问题解决了,谢谢。

#6 楼 @spiderxu 能提供下解决的代码看下吗

#7 楼 @kingwkb 将上面的 java 代码里

kgen.init(128, new SecureRandom(password.getBytes()));  
                    SecretKey secretKey = kgen.generateKey();  
                    byte[] enCodeFormat = secretKey.getEncoded();  
                    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");  

去掉换成

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

就可以,确保密钥是 16 位,可以再优化一下,将两边使用 MD5 对 key 进行加密一下。

有一个和题主类似的疑问,不过我想获得同题目中的 Java 代码一样的加密结果,题目中的 Ruby 代码应该如何调整? 求教大神 @luikore

研究发现 Java 代码中 SecureRandom 用的随机算法是 NativePRNG 而 Ruby 中并没有该实现

需要 登录 后方可回复, 如果你还没有账号请 注册新账号