javax.crypto.BadPaddingException: Blocktype mis...

2286 ワード

エラー:javax.crypto.BadPaddingException: Blocktype mismatch 1.最近、RSA暗号化を行い、androidクライアントとサーバ(JavaEE)のデータ転送のセキュリティを強化しました.andoridで生成された(鍵ペアはwindowsでサーバによって生成され、公開鍵をクライアントに送信して保存される)パスワードが、サーバで秘密鍵で復号できないことが分かった.2.テストのために、サーバーでローカルに復号するのは正常で、またandroidで復号するのも正常ですが、サーバーで暗号化(同じ公開鍵を使用)したパスワードもandroidシステムで復号できません(同じ秘密鍵を使用します).3.グーグルは、暗号化中の入力文字の長さが異なる可能性があることを明らかにした.これは、復号化時に指定されたRSAアルゴリズムと関係がある.4.例えば、A機で標準RSAアルゴリズムを使用して公開鍵で暗号化し、Bシステムで「RSA/ECB/NOPadding」を使用して秘密鍵で復号化すると、復号化することができますが、復号化後の原文の前に特殊文字が多く含まれていることがわかります.これは暗号化前に充填された空の文字です.Bシステムで標準的なRSAアルゴリズムを使用して復号化されている場合、これは同じタイプのJDK仮想マシン環境ではもちろん完全に同じであり、androidシステムで使用されている仮想マシン(dalvik)とSUN標準JDKとは異なることが重要であり、デフォルトのRSA実装は異なる.
5.よりイメージ的に、暗号化時に暗号化された原文「abc」は、「abc」を直接使用します.getBytes()メソッドで得られたbytesの長さは3しかないかもしれないが、システムはまず512ビットのbyte配列に入れ、new byte[512]を暗号化する.しかし、解読するときにあなたが使っているのは「暗号化されたパスワード」です.getBytes()は復号化され、復号化された原文は自然に512長のデータであり、すなわち「abc」の外に500バイト以上の他の空文字が追加されている.
参照:
Afters some hours of trying, confirming that the key pairs are the same, using different options of saving the public key in the Android filesystem, etc. I finally found a post stating that Android is using the Bouncycastle Security provider. Bouncycastle’s default RSA implementation is: “RSA/None/NoPadding”, whereas Sun’s default security provider implementation is “RSA/None/PKCS1Padding”. So, no decryption possible when just using
Cipher.getInstance("RSA")

because of the different paddings used. So for a solution I downloaded the bouncycastle Jar, added bounycastle as a Security provider to my Java App, and now use
Cipher.getInstance("RSA", "BC");

It works fine now. EOF.この仁兄はandroidシステムのRSA実装を「RSA/ECB/No Padding」と分析しているが、標準JDK実装は「RSA/None/PCCS 1 Padding」であり、androidマシン上で暗号化した後、サーバ上で復号できない原因(サーバがSUN JDK 6.0を使用している)をもたらしている.他のJDK、OpenJDKなどは、仮想マシンのパフォーマンスやゴミ回収メカニズムなどのアーキテクチャの違いだけでなく、デフォルトの実装も異なる場合があります.
参考:Struggling with RSA&Bouncycastle on Android、RSA BadPadding Exceptionhttps://forums.oracle.com/forums/thread.jspa?threadID=1526306 Decrypting RSA with Java.security - Hex to dec conversion and byte arrays...