簡體   English   中英

如何在iPhone中將PKCS5padding與AES128一起使用

[英]How to use PKCS5padding with AES128 in iphone

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


}

請建議是否有人有想法。 給我建議。

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)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM