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文字の後で発散するだけではありません)。