【发布时间】:2013-07-02 09:37:17
【问题描述】:
我已经使用 PKCS7padding 使用 AES128 进行了加密和解密,但它没有使用 Android 和 .NET 进行解密。在 Android 和 .NET 中,Pkcs5padding 用于加密和解密。我的代码是:
- (NSData *)AES128EncryptWithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused)
bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding)
[key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128,
NULL ,[self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted );
if( cryptStatus == kCCSuccess )
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free( buffer );
return nil;
}
- (NSData *)AES128DecryptWithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES128+1];
bzero( keyPtr, sizeof( keyPtr ) );
[key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128,
NULL ,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted );
if( cryptStatus == kCCSuccess )
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free( buffer );
return nil;
}
如果有人有想法,请提出建议。给我一些建议。
【问题讨论】:
-
"但它不能用 Android 和 .NET 解密" > 你能说得更具体些吗?你把垃圾拿出来吗?第一块是垃圾吗?您是否收到填充错误?
-
是的,我遇到了填充错误。但感谢上帝,现在我通过实施 kCCOptionECBMode 解决了这个问题。问题解决了。谢谢回复
-
好。请删除此问题或发布并接受您自己的答案。
-
@DuncanJones 坏主意,答案应该是 PKCS#5 填充和 PKCS#7 填充是相同的,而不是提问者代码中的一些无关问题......
-
安妮,如果你删除了这个,请发表评论,以便我可以“询问”并回答关于填充的更具体的问题。