1

我已经使用 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;


}

请建议是否有人有想法。给我建议。

4

1 回答 1

2

PKCS#5 和 PKCS#7 填充之间只有一个主要区别是块大小。PKCS#5 填充仅针对 8 字节块大小定义。PKCS#7 填充适用于从 1 到 255 字节的任何块大小。

这是PKCS#5填充(6.2)的定义:

填充字符串 PS 应由 8 - (||M|| mod 8) 八位字节组成,所有字节的值都为 8 - (||M|| mod 8)。

PKCS#7是相同的,只是它允许块大小最大为 256 字节(10.3 注 2):

对于这样的算法,方法应该是在输入的尾端用 k - (l mod k) 个八位字节填充所有的值 k - (l mod k),其中 l 是输入的长度。

所以从根本上说,PKCS#5 填充是 8 字节块大小的 PKCS#7 填充的子集。

大多数加密库使用 PKCS#5 或 PKCS#7 来定义相同的填充机制。如果在计算中使用 8 以外的块大小,官方 PKCS#7 当然是唯一正确的。

请注意,PKCS#5 和 PKCS#7 都不是填充机制的标准。填充部分只是已定义功能的一小部分(基于密码的加密或 PBE,以及密码消息语法或 CMS)。

于 2013-07-03T17:36:44.950 回答