【问题标题】:Decrypt with java and AES file encrypted in Obj-C使用在 Obj-C 中加密的 java 和 AES 文件进行解密
【发布时间】:2013-05-12 23:30:55
【问题描述】:

我有一个用 obj-c 代码加密的文件:

NSMutableData *fileData = [NSMutableData new];
// Get file data.
[[self encrypt::fileData WithKey:@"SOME_KEY"]]

- (NSMutableData*) encrypt:(NSMutableData*)data WithKey: (NSString *) key
{
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyBuffer[kCCKeySizeAES128+1]; // room for terminator (unused)
    bzero( keyBuffer, sizeof(keyBuffer) ); // fill with zeroes (for padding)

    [key getCString: keyBuffer maxLength: sizeof(keyBuffer) encoding: NSUTF8StringEncoding];

    // encrypts in-place, since this is a mutable data object
    size_t numBytesEncrypted = 0;

    size_t returnLength = ([data length] + kCCKeySizeAES256) & ~(kCCKeySizeAES256 - 1);

    char* returnBuffer = malloc(returnLength * sizeof(uint8_t) );

    CCCryptorStatus result = CCCrypt(kCCEncrypt, kCCAlgorithmAES128 , kCCOptionPKCS7Padding | kCCOptionECBMode,
                                 keyBuffer, kCCKeySizeAES128, nil,
                                 [data bytes], [data length],
                                 returnBuffer, returnLength,
                                 &numBytesEncrypted);

    if(result == kCCSuccess)
        return [NSMutableData dataWithBytes:returnBuffer length:numBytesEncrypted];
    else
        return nil;
}

我想用 java 读取这个文件。我正在尝试

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
// What is salt ??
KeySpec spec = new PBEKeySpec("SOME_KEY", salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");
System.out.println(plaintext);

我对 obj-c 一无所知。你认为我能完成这件事吗?谢谢。

【问题讨论】:

  • 这就是Objective-C加密代码的全部吗?如果没有,请发布其余部分。
  • 我用加密的代码编辑。

标签: java objective-c aes


【解决方案1】:

使用 Cipher.getInstance("AES/ECB/PKCS5Padding");,因为 Objective-C 代码使用的是 ECB 而不是 CBC(你应该使用 CBC 或 CTR 而不是 ECB,但在这种情况下你似乎别无选择)

另外,请使用SecretKey secret = new SecretKeySpec("SOME_KEY".getBytes("UTF-8"), "AES");,因为 Objective-C 代码只是使用密码中的原始字节来生成密钥(而不是像您正在做的那样使用加密密钥生成器)。 “SOME_KEY”需要与 Objective-C 代码使用的密码相同。此外,"SOME_KEY".getBytes("UTF-8") 需要正好是 16 个字节,因此如果需要,您需要将其截断为 16 个字节,或者用 0 填充到 16 个字节。

【讨论】:

  • 我按照你的建议做了,但我有:线程“主”javax.crypto.BadPaddingException 中的异常:给定最终块未正确填充
  • @Baptiste Pernet 发布 Objective-C 输出/Java 输入的最后 16 个字节,以便我可以看到它是如何填充的
  • , -19, 87, -27, -113, 98, 80, -77, 57, -60, 31, -68, 73, 103, 51, -36, 50]跨度>
  • 是的,没有正确填充 - 它应该是 01;或 02, 02;或 03、03、03;等
  • 前 16 个字节是什么样的?我想字节数组可能会以某种方式反转
猜你喜欢
  • 2014-01-14
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2015-10-22
相关资源
最近更新 更多