2013-05-12 65 views
0

我有与OBJ-C代码加密的文件:解密用java和AES文件中的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一无所知。你认为我能完成这件事吗?谢谢。

+0

是整体的Objective-C加密代码吗?如果没有,请发布其余的。 – 2013-05-13 01:47:24

+0

我使用加密的代码进行编辑。 – 2013-05-13 08:33:21

回答

0

使用Cipher.getInstance("AES/ECB/PKCS5Padding");因为Objective-C的代码是使用ECB而不是CBC(你应该使用CBC或点击率,而不是欧洲央行,但在这种情况下,它看起来并不像你有一个选择)

而且,使用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个字节。

+0

我做了你的建议,但我有:线程“主”异常javax.crypto.BadPaddingException:给定最后的块没有正确填充 – 2013-05-13 20:30:54

+0

@Baptiste Pernet张贴Objective-C输出/ Java输入的最后16个字节,所以我可以看看它是如何填充的 – 2013-05-13 20:36:34

+0

,-19,87,-27,-113,98,80,-77,57,-60,31,-68,73,103,51,-36,50] – 2013-05-13 20:41:45