1

我正在尝试加密/解密数据 ios 到 java & java 到 ios 但是我在 java 中加密的数据没有在 ios 中正确解密 & 在 ios 中加密的数据在 java 中没有正确解密

- (NSData *) encrypt:(NSData *) dataToEncrypt symmetricKey:(NSData *)symmetricKey context:(CCOperation)encryptOrDecrypt{
    NSUInteger data_length= [dataToEncrypt length];
    uint8_t input_raw_data[data_length];

    //The [dataToEncrypt length] gives the number of chars present in the string.So say there are 10 chars.
    //Now,the getBytes needs to get the raw bytes from this i.e. binary NSData.But suppose the encoding was
    //full 16 bit encoding then the number of bytes needed wd have been double- 20.But as we are using the
    //NSUTF8StringEncoding,the number of byes needed is 1 per char as the chars(even if originally unicode are
    //compressed into an 8 bit UTF8 encoding.)

    [dataToEncrypt getBytes:&input_raw_data length:data_length];

//    [dataToEncrypt getBytes:&input_raw_data maxLength:data_length usedLength:NULL encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0,data_length) remainingRange:NULL];

    //According to the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That's why we need to add the size of one block here
    size_t buffer_size           = data_length + kCCBlockSizeAES128;
    void* buffer                 = malloc(buffer_size);
    size_t num_bytes_encrypted   = 0;


    CCCryptorStatus crypt_status = CCCrypt(encryptOrDecrypt, kCCAlgorithmAES128, 0x0000,
                                           [symmetricKey bytes], kCCKeySizeAES128,
                                           NULL,
                                           input_raw_data, data_length,
                                           buffer, buffer_size,
                                           &num_bytes_encrypted);

//    NSLog(@"~~num bytes encrypted: %d",num_bytes_encrypted);
    if (crypt_status == kCCSuccess){
        NSLog(@"~~Data encoded successfully...");
        return [NSData dataWithBytesNoCopy:buffer length:num_bytes_encrypted];
    }

    free(buffer); //free the buffer;
    return nil;

}

我用过这个

Java 代码 -

 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
 String keyString = "keykeykeykeykeykeykeykey";
 byte[] keyBytes = keyString.getBytes("UTF-8"); 
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, "AES"), new IvParameterSpec(new byte[16])); 
byte[] resultBytes = cipher.doFinal("Hallo Welt!".getBytes("UTF8")); 
FileOutputStream out = new FileOutputStream(new File("encryptedFileJava")); 
out.write(resultBytes); out.close();

这是加密文本 - “SeáJbë|8”R,

关键 - BW3dKDf2bkDC4Bq9xTdr1g==

请帮助我或建议我任何解决方案。

谢谢你。

4

2 回答 2

1

你至少有两个问题:

  1. Objective C 代码使用 ECB 模式,而 Java 代码使用 CBC 模式。在 CCrypt 调用中使用零字节数组而不是 NULL 来使用具有零 IV 的 CBC 模式,如 Java 代码。

  2. 由于 keyBytes 是 24 字节长,Java 将使用 AES-192。CCrypt 将忽略额外的字节。将 AES-192 指定给 CCrypt 或使用 128 位密钥(“keykeykeykeykeyk”应该可以工作)。

于 2013-06-12T08:20:54.500 回答
0

对于 IOS 和 Java 设备之间的安全通信,可以使用对称密钥加密。

在平台不同的这种情况下,建议生成的密钥是纯文本密钥,而不是 API 生成的密钥。

在这种情况下可以使用 AES 128 位加密。IOS 设备能够生成对称密钥并使用 AES 加密对文本进行加密。

下面的链接提供了使用纯文本对称密钥加密和解密的 java 代码

http://www.java-redefined.com/2015/06/symmetric-key-encryption-ios-java.html

于 2015-06-02T13:08:32.027 回答