iOS中RSA加密詳解


先貼出代碼的地址,做個說明,因為RSA加密在iOS的代碼比較少,網上開源的也很少,最多的才8個星星。使用過程中發現有錯誤。然后我做了修正,和另一個庫進行了整合,然后將其支持CocoaPod。

https://github.com/qianhongqiang/RSAEncryptor

RSA加密的原理就不拾人牙慧了,一搜一大堆。不過在這里還是要感嘆下數學的魅力。

在這里對代碼的一些細節進行一下分析,

- (NSData*) rsaEncryptData:(NSData*)data {
    SecKeyRef key = [self getPublicKey];
    size_t cipherBufferSize = SecKeyGetBlockSize(key);
    uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));
    size_t blockSize = cipherBufferSize - 11;
    size_t blockCount = (size_t)ceil([data length] / (double)blockSize);
    NSMutableData *encryptedData = [[NSMutableData alloc] init] ;
    for (int i=0; i<blockCount; i++) {
        NSInteger bufferSize = MIN(blockSize,[data length] - i * blockSize);
        NSData *buffer = [data subdataWithRange:NSMakeRange(i * blockSize, bufferSize)];
        OSStatus status = SecKeyEncrypt(key, kSecPaddingPKCS1, (const uint8_t *)[buffer bytes], [buffer length], cipherBuffer, &cipherBufferSize);
        if (status == noErr){
            NSData *encryptedBytes = [[NSData alloc] initWithBytes:(const void *)cipherBuffer length:cipherBufferSize];
            [encryptedData appendData:encryptedBytes];
        }else{
            if (cipherBuffer) {
                free(cipherBuffer);
            }
            return nil;
        }
    }
    if (cipherBuffer){
        free(cipherBuffer);
    }
    return encryptedData;
}

這里是加密的邏輯,根據RSA的原理,cipherBufferSize是秘鑰長度/8,也就是秘鑰的字節數,加密的長度不能超過秘鑰的長度,所以加密需要分段。舉個例子,你加密的長度是300個字節,你的秘鑰是1024位(128字節)的,那么你需要分成3段去加密,前面兩段是128,最后一段是44個字節。但是這個加密塊大小不能直接這么設置,需要有一塊用於填充加密信息的,RSA_PKCS1_PADDING,具體的可以參見這片博文

http://www.cnblogs.com/spencerN/archive/2012/10/18/2729602.html

所以無論你的秘鑰長度是多少,都需要保留11個字節用於PKCS1填充。這也就是代碼中出現了-11的原因。kSecPaddingPKCS1在這里會被用到
SecKeyEncrypt(key, kSecPaddingPKCS1, (const uint8_t *)[buffer bytes], [buffer length], cipherBuffer, &cipherBufferSize);分段加密出來的結果是秘鑰的長度,會比加密前長出11個字節
分段加密的結果拼接后獲得最終的加密結果。
解密也是一樣的流程,不過不要設置RSA_PKCS1_PADDING,只需要按照秘鑰的長度去獲取,流程與加密幾乎一致。在我最初的代碼中,原作者沒有分段揭秘,我修正了這個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM