0

Java と Ruby の間で暗号化されたデータを通信するのに問題があります。Java => Java は正常に動作する Ruby => Ruby は正常に動作する Ruby => Java は正常に動作する Java => Ruby は動作しない (エラー: 間違った最終ブロック長)。

Java では、このコードを使用してデータを暗号化し、それを Rails サーバーに投稿します キーサイズ

   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  

そして、「間違った最終ブロック長」というエラーが表示されます

それを修正する方法について何か考えはありますか?

4

2 に答える 2

1

使用されているパディングスキームが原因であると思われます。PKCS5 パッドは 64 ビット (8 バイト) ブロック サイズですが、AES-256-CBC は 16 バイト ブロックを使用します。したがって、Java 側で PKCS7 パディングを使用してみてください。

于 2013-10-17T03:24:14.080 に答える