java - AES CBC PKCS5Padding Java 到 Ruby

标签 java android ruby-on-rails ruby encryption

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

在java中,我使用此代码来加密数据,然后将其发布到rails服务器 key 大小

   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);

在 ruby 中我使用

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  

并得到错误“最终 block 长度错误”

知道如何解决这个问题吗?

最佳答案

我怀疑这可能是由于使用的填充方案引起的。 PKCS5 pad 的 block 大小为 64 位(8 字节),但 AES-256-CBC 使用 16 字节 block 。因此,Java端尽量使用PKCS7 padding。

关于java - AES CBC PKCS5Padding Java 到 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19417537/

相关文章:

ruby-on-rails - Ruby on Rails DynamoDB AWS 开发工具包 v2

ruby-on-rails - Ruby/Rails 迁移之外的数据库更改

java - Collection.contains() -> 获取项目

java - 从另一个 Android 应用程序访问公共(public)对象

iphone - HTML5 网络应用与原生移动应用

javascript - 检测其他打开的网站甚至应用程序的数量(可能)?

java - 在 android studio 中只调试 JAVA 代码

java - 如何将 jar 文件包含到 Scala 代码中

Java运行时exec不能很好地处理字符串数组

android - 具有子依赖项(嵌套依赖项)的 gradle 依赖项管理