如何在iphone中使用PKSC5padding和AES128

时间:2013-07-02 09:37:17

标签: android .net ios6 aes

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


}

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

1 个答案:

答案 0 :(得分: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填充是PKCS#7填充的一个子集,用于8字节块大小。

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

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