AES CBC PKCS5P将Java添加到Ruby

AES CBC PKCS5P将Java添加到Ruby,java,android,ruby-on-rails,ruby,encryption,Java,Android,Ruby On Rails,Ruby,Encryption,我在java和ruby之间传输加密数据时遇到问题。 Java=>Java工作正常 Ruby=>Ruby工作正常 Ruby=>Java工作正常 Java=>Ruby不工作(错误:错误的最终块长度) 在java中,我使用此代码加密数据,然后将其发布到rails服务器 关键尺寸 并得到错误“错误的最终块长度” 有没有办法解决这个问题?我怀疑这可能是由于使用了填充方案造成的。PKCS5焊盘具有64位(8字节)块大小,但AES-256-CBC使用16字节块。因此,尝试在Java端使用PKCS7填充。上面的

我在java和ruby之间传输加密数据时遇到问题。 Java=>Java工作正常 Ruby=>Ruby工作正常 Ruby=>Java工作正常 Java=>Ruby不工作(错误:错误的最终块长度)

在java中,我使用此代码加密数据,然后将其发布到rails服务器 关键尺寸

并得到错误“错误的最终块长度”


有没有办法解决这个问题?

我怀疑这可能是由于使用了填充方案造成的。PKCS5焊盘具有64位(8字节)块大小,但AES-256-CBC使用16字节块。因此,尝试在Java端使用PKCS7填充。

上面的代码工作正常。问题在于通过post请求发送的base64的编码。

我尝试了
Cipher-Cipher=Cipher.getInstance(“AES/CBC/PKCS7Padding”),但出现相同的故障:(@Antzi,你检查过Java和Ryby端的密文字节数组是否相同吗?以防万一Base64实现行为不同,我会检查。但是,我相信实现是相同的,因为我使用相同的方法来解包成功解码ruby编码的数据时使用的Base64密钥。在此上下文中,pkcs7填充和pkcs5填充是等效的。Java不接受“PKCS7PADDING”作为填充选项。
   static public synchronized String encryptAesData(Context pContext, String pData, byte[] pKey, byte[] pIv) {
        Log.d("", "key size <" + pKey.length + "> iv size <" + pIv.length + ">"); //key size <32> iv size <16>

        AlgorithmParameterSpec paramSpec = new IvParameterSpec(pIv);
        SecretKeySpec key = new SecretKeySpec(pKey, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        byte[] encrypted = cipher.doFinal(pData.getBytes());
        return Base64.encodeToString(encrypted, Base64.DEFAULT);
encrypted_data = Base64.decode64(raw_data)                                                                                                                                                                  
decipher = OpenSSL::Cipher::AES.new(256, :CBC)                                                                                                                                                              
decipher.decrypt                                                                                                                                                                                            
decipher.key = "censored_key".unpack('A*').pack('H*')# decipher.key.size = 32                                                                                                                               
decipher.iv = "censored_iv".unpack('A*').pack('H*') # decipher.iv.size = 16                                                                                                                                 
plain = decipher.update(encrypted_data) + decipher.final