Android AES 128 加密

标签 android iphone encryption aes

我正在尝试在 Android 上实现 AES128 加密。我有一个解决方案可以在带有 Objective C 的 iPhone 上运行,但无法将其移植到 Android。我在 stackoverflow 上搜索了一个解决方案,但我似乎做错了什么。我是 Java 的新手,所以我想我缺少与数据、字符串转换有关的东西。

这是我的 iPhone 加密:

char keyPtr[kCCKeySizeAES128+1];
[keyString getCString:keyPtr
            maxLength:sizeof(keyPtr)
             encoding:NSASCIIStringEncoding];

// CString for the plain text
char plainBytes[[plainString length]+1];
[plainString getCString:plainBytes
              maxLength:sizeof(plainBytes)
               encoding:NSASCIIStringEncoding];

size_t bytesEncrypted = 0;

// Allocate the space for encrypted data
NSUInteger dataLength = [plainString length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);

// Encrypt
CCCryptorStatus ret = CCCrypt(kCCEncrypt,
                              kCCAlgorithmAES128,
                              kCCOptionPKCS7Padding | kCCOptionECBMode,
                              keyPtr,
                              kCCKeySizeAES128,
                              NULL,
                              plainBytes, sizeof(plainBytes),
                              buffer, bufferSize,
                              &bytesEncrypted);
if (ret != kCCSuccess) {
    free(buffer);
}

encryptedData = [NSData dataWithBytes:buffer length:bytesEncrypted];

这是我的Java:

    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));

在 iPhone 和 Java 中使用相同的 key 和明文会得到不同的结果。我的 iPhone 结果按照我需要的方式工作,所以我试图让 java 给我 iPhone 结果。我肯定在 Java 中遗漏了一些东西,只是不确定它是什么。

编辑

根据下面的建议,我将我的 Java 修改成了这个

    byte[] keyBytes = plainTextKey.getBytes("US-ASCII");
    SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(plainText.getBytes("US-ASCII"));

但我仍然在 Android 和 iPhone 之间得到不同的结果

最佳答案

除了明文编码困难(正如 vcsjones 在评论中指出的那样),请确保 key 字符串的编码相同(请注意,使用原始字符串,如密码,直接作为加密 key 是坏消息,在密码上使用像 PBKDF2 这样的 key 派生函数来派生 key )。

此外,Java 的 ASCII 编码字符串是 US-ASCII,而不仅仅是 ASCII,因此请确保在您的 getBytes 中使用它> 通话。

编辑:发现您的问题:iOS 字符串在末尾使用额外的空字符 (0x00) 进行加密,而 java 则没有。因此,在 Java 中加密“hello world\0”将为您提供与“hello world”在 iOS 中相同的输出

关于Android AES 128 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15390479/

相关文章:

java - 在 Android 中解密 Rijndael

java - 建议Libgdx初学者教程?

android - 我的 ListView 不显示最后一项

iphone - 禁用 UIWebView 中特定 HTML 元素的数据检测器

java - 使用 Fernet 在 Java 上进行对称加密

java - 为什么在密文中翻转一点后我仍然可以解密部分数据?

java - 如何导出vCard 3.0?

android - Recycler View 未在 Activity 中显示任何内容

iphone - iPhone URL 方案的 Twitter 官方列表在哪里?

iphone - 删除 subview 时,从父 View 中删除