ios java aes加密_如何使Java和Objective-C(iPhone)之间的AES加密完全相同?

我正在用Objective-

C加密一个字符串,并且也在Java中使用AES加密了相同的字符串,并且遇到了一些奇怪的问题。结果的第一部分匹配到某个点,但随后又有所不同,因此当我去将Java的结果解码到iPhone上时,它无法解密。

我正在使用源字符串“现在,这是什么废话。您知道吗?” 使用“ 1234567890123456”键

要加密的Objective-C代码如下:注意:这是一个NSData类别,因此假定在NSData对象上调用了该方法,因此“ self”包含要加密的字节数据。

- (NSData *)AESEncryptWithKey:(NSString *)key {

char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused)

bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

// fetch key data

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

NSUInteger dataLength = [self length];

//See 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 bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,

keyPtr, kCCKeySizeAES128,

NULL /* initialization vector (optional) */,

[self bytes], dataLength, /* input */

buffer, bufferSize, /* output */

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

//the returned NSData takes ownership of the buffer and will free it on deallocation

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer); //free the buffer;

return nil;

}

Java加密代码是…

public byte[] encryptData(byte[] data, String key) {

byte[] encrypted = null;

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

byte[] keyBytes = key.getBytes();

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

try {

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, keySpec);

encrypted = new byte[cipher.getOutputSize(data.length)];

int ctLength = cipher.update(data, 0, data.length, encrypted, 0);

ctLength += cipher.doFinal(encrypted, ctLength);

} catch (Exception e) {

logger.log(Level.SEVERE, e.getMessage());

} finally {

return encrypted;

}

}

Objective-C代码的十六进制输出为-

7a68ea36 8288c73d f7c45d8d 22432577 9693920a 4fae38b2 2e4bdcef 9aeb8afe 69394f3e 1eb62fa7 74da2b5c 8d7b3c89 a295d306 f1f90349 6899ac34 63a6efa0

Java输出是-

7a68ea36 8288c73d f7c45d8d 22432577 e66b32f9 772b6679 d7c0cb69 037b8740 883f8211 748229f4 723984beb 50b5aea1 f17594c9 fad2d05e e0926805 572156d

如您所见,一切都很好-

7a68ea36 8288c73d f7c45d8d 22432577

我猜我有一些不同的设置,但无法解决问题,我尝试在Java端在ECB和CBC之间进行更改,但没有任何效果。

谁能帮忙!请....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值