简体   繁体   English

如何在iPhone中将PKCS5padding与AES128一起使用

[英]How to use PKCS5padding with AES128 in iphone

I have done encryption and decryption with AES128 with PKCS7padding but its not decrypting with Android and .NET. 我已经使用PKCS7padding使用AES128进行了加密和解密,但是没有使用Android和.NET进行解密。 In Android and .NET Pkcs5padding is using for encryption and decryption. 在Android和.NET中,Pkcs5padding用于加密和解密。 My code is: 我的代码是:

- (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;


}

Please suggest if anyone have idea. 请建议是否有人有想法。 Give me suggestions. 给我建议。

There is only one main difference between PKCS#5 and PKCS#7 padding is the block size. PKCS#5和PKCS#7填充之间的主要区别只是块大小。 PKCS#5 padding is only defined for 8-byte block sizes. PKCS#5填充仅针对8字节块大小定义。 PKCS#7 padding would work for any block size from 1 to 255 bytes. PKCS#7填充适用于从1到255字节的任何块大小。

This is the definition of PKCS#5 padding (6.2): 这是PKCS#5填充(6.2)的定义:

The padding string PS shall consist of 8 - (||M|| mod 8) octets all having value 8 - (||M|| mod 8). 填充字符串PS应由8-(|| M || mod 8)个八位字节组成,所有八位字节均具有值8-(|| M || mod 8)。

PKCS#7 is the same except that it allows block sizes up to 256 bytes in size (10.3 note 2): PKCS#7相同,除了它允许的块大小最大为256个字节(10.3注2):

For such algorithms, the method shall be to pad the input at the trailing end with k - (l mod k) octets all having value k - (l mod k), where l is the length of the input. 对于这种算法,该方法应在尾端用k-(l mod k)个八位字节填充输入,所有八位字节均具有值k-(l mod k),其中l是输入的长度。

So fundamentally PKCS#5 padding is a subset of PKCS#7 padding for 8 byte block sizes. 因此,从根本上讲,PKCS#5填充是PKCS#7填充的8个字节块大小的子集。

Most cryptographic libraries use either PKCS#5 or PKCS#7 to define the same padding mechanism. 大多数密码库都使用PKCS#5或PKCS#7定义相同的填充机制。 Officially PKCS#7 would of course be the only correct one if block sizes other than 8 are used within the calculation. 如果计算中使用的块大小不是8,则PKCS#7当然是唯一正确的选择。

Note that both PKCS#5 and PKCS#7 are not standards for padding mechanisms. 请注意,PKCS#5和PKCS#7都不是填充机制的标准。 The padding part is only a small subset of the defined functionality (password based encryption or PBE, and the cryptograpic message syntax or CMS respectively). 填充部分只是所定义功能的一小部分(分别基于密码的加密或PBE,以及加密消息的语法或CMS)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM