AES 128 Android和Objective C之间的兼容性

我有两个应用程序:Android和iOS(Objective-C)。 我正在尝试实施和加密系统,以便我可以在两个应用程序上加密并在服务器应用程序中解密。 问题是我使用AES128-ECB但是我从android获得的base64密钥与我的目标c密钥不匹配。 我不知道我错过了什么。

以下是片段:IOS

- (NSData*) EncryptAES: (NSString *) key{ char keyPtr[kCCKeySizeAES128+1]; bzero( keyPtr, sizeof(keyPtr) ); [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding:NSUTF8StringEncoding]; size_t numBytesEncrypted = 0; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); const unsigned char iv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; CCCryptorStatus result = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES128, iv, [self bytes], [self length], buffer, bufferSize, &numBytesEncrypted ); if( result == kCCSuccess ) return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; else { NSLog(@"Failed AES"); } return nil; } 

接着:

 NSString *pass = @"WORD_TO_ENCRYPT"; NSString *key = @"STRING_KEY"; //Encryption - APPROACH 1 NSData *data = [pass dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedData = [data EncryptAES:key]; NSString* encryptedBase64 = [self Base64Encode:encryptedData]; NSLog(@"%@", encryptedBase64); 

这是我的Java函数:

  String plainTextKey = "STRING_KEY"; String plainText = "WORD_TO_ENCRYPT"; // Encrypt where jo is input, and query is output and ENCRPYTION_KEy is key //String inputtt = "some clear text data"; byte[] input = new byte[0]; String skyKey; input = plainText.getBytes("utf-8"); MessageDigest md; md = MessageDigest.getInstance("MD5"); byte[] thedigest = md.digest(plainTextKey.getBytes("UTF-8")); SecretKeySpec skc = new SecretKeySpec(thedigest, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skc); byte[] cipherText = new byte[cipher.getOutputSize(input.length)]; int ctLength = cipher.update(input, 0, input.length, cipherText, 0); ctLength += cipher.doFinal(cipherText, ctLength); String encode = Base64.encode(cipherText); System.out.println(encode); 

我在不知道自己错过了什么的情况下撞到了墙上。 在此先感谢您的帮助!

PS:我没有任何特别的理由使用AES128-ECB。 如果多系统兼容性更简单,我可以使用任何其他算法。

在Android端,初始化Cipher实例时,必须提供匹配的IV。

 byte[] iv = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; cipher.init(Cipher.ENCRYPT_MODE, skc, new IvParameterSpec(iv)); 

避免使用硬编码的IV加密机制,至少在Android上。 建议使用随机数生成器 ,但如果不能提供随机值,至少要从密钥中构建IV。

另一方面,如果一切都来自密码,您将无法获得良好的安全性; 你需要在每条消息中都有一些随机性。

确保存储加密期间使用的IV,以便您可以在解密时正确应用它。

 byte[] iv = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; cipher.init(Cipher.ENCRYPT_MODE, skc, new IvParameterSpec(iv));