3

AESアルゴリズムを使用して、iPhoneおよびAndroidアプリのデータを.NETサーバーに送信する前に暗号化します。

iPhoneの暗号化は正常に機能します(.NETサーバーコードは問題なく復号化します)。

Androidの暗号化は、16文字未満のクリアテキスト文字列に対して正常に機能します。クリアテキスト文字列>=16文字の場合、最初の暗号化された「チャンク」はiPhoneと同じであり、2番目の暗号化されたチャンクは完全に異なります。私の鍵長は16文字です。

これがAndroidコードです(16文字まで正常に動作します):

byte[] valueData = value.getBytes();   
byte[] keyData = skey.getBytes();

SecretKeySpec skeySpec = new SecretKeySpec(keyData, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] valueEncryptedData = cipher.doFinal(valueData);
String valueEncryptedString = Base64.encodeToString(valueEncryptedData, Base64.DEFAULT);

return valueEncryptedString;

そして、これが私のiOSコードで、正常に動作します。

StringEncryption *crypto = [[StringEncryption alloc] init];
CCOptions padding = kCCOptionPKCS7Padding;

NSData *valueData = [value dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [skey dataUsingEncoding:NSUTF8StringEncoding];
NSData *valueEncryptedData = [crypto encrypt:valueData key:keyData padding:&padding];
NSString *valueEncryptedString = [valueEncryptedData base64EncodingWithLineLength:0];

問題は些細なことだと思います。たとえば、間違った暗号の初期化を使用している可能性があり、ECBの代わりにCBCを使用する必要があります。ただし、を使用した出力でCipher.getInstance("AES/CBC/PKCS7PADDING")も、望ましい結果は得られません(実際、暗号化された値はiPhoneの暗号化された値とは完全に異なり、最初の16文字の後で発散するだけではありません)。

4

1 に答える 1

2

間違った暗号モードを使用している可能性があります。そして、ほとんどの場合、ECB の代わりに CBC を使用する必要があります。また、CBC には IV (初期ベクトル) が必要であり、異なる暗号化方式では異なるデフォルト ベクトルを使用できるため、最初の試行からは機能しません。

于 2013-02-27T09:35:47.907 に答える