Ruby Ruby AES 128 cbc 的问题

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

我用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

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

共收到 10 条回复

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 中并没有该实现

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