在将数据发送到 .NET 服务器之前,我使用 AES 算法对 iPhone 和 Android 应用程序上的数据进行加密。
iPhone 加密工作正常(.NET 服务器代码解密它没问题)。
Android 加密适用于小于 16 个字符的明文字符串。对于 >= 16 字符的明文字符串,第一个加密的“块”与 iPhone 相同,第二个加密的块完全不同。我的密钥长度是 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];
我怀疑这个问题是微不足道的。例如,也许我使用了错误的密码初始化,我应该使用 CBC 而不是 ECB。但是,使用的输出Cipher.getInstance("AES/CBC/PKCS7PADDING")
也不会产生预期的结果,(事实上,更糟糕的是,加密值与 iPhone 加密值完全不同,而不仅仅是在前 16 个字符之后发散)。