iOS RSA2 加密、解密 、簽名和驗證簽名

突然發現接收百度資源太多了,我也回饋一下吧。

RSA2 標準算法名稱 SHA256WithRSA

1、RSA非對稱加密技術

2、SHA256 是SHA-2下細分出的一種算法

SHA-2,名稱來自於安全散列算法2(英語:Secure Hash Algorithm 2)的縮寫,一種密碼散列函數算法標準,由美國國家安全局研發,屬於SHA算法之一,是SHA-1的後繼者。

詳細介紹連接:https://blog.csdn.net/u011583927/article/details/80905740

1、加密和解密

公鑰是公開的密鑰,有加密方使用。只用於加密無法解密。私鑰是不公開的,別人無法獲取,用戶解密。

注意的是,爲什麼私鑰對同一數據進行簽名加密的結果是一樣的,使用公鑰進行加密就不一樣了呢?

詳細請參考:https://blog.csdn.net/guyongqiangx/article/details/74930951

2、簽名和驗證簽名

簽名是由發送數據的一方發起的,防止傳輸過程中被篡改數據內容。因此簽名使用的是私鑰。而驗證簽名使用的是公鑰。

附帶:

php RSA2 加密、解密 、簽名和驗證簽名

https://blog.csdn.net/TaLinBoy/article/details/106124132

java:RSA2 加密、解密 、簽名和驗證簽名

https://blog.csdn.net/TaLinBoy/article/details/106124535

 

1、下載git資源   https://github.com/ideawu/Objective-C-RSA

2、Objective-C-RSA 本身就是 RSA 加密和解密的Demo

3、添加簽名和驗證方法

      導入頭文件:#import <CommonCrypto/CommonDigest.h>  

      否則無法使用 :CC_SHA256_DIGEST_LENGTH

      Objective-C-RSA包含通過base64字符串轉私鑰和公鑰的方法:

     //服務器的公鑰獲取

     [self getServicePublicKey];

    //app的私鑰

    [RSA addPrivateKey:[self getPrivateKey]]

 

    代碼:


// 簽名
+ (NSString *) sign:(NSString *)storString{
    // 使用哈希算法獲取字符串摘要
    NSLog(@"=0===== [%@]",storString);
    // sha256加密
    NSData *outData = [self sha256:storString];
    SecKeyRef pKey = [RSA addPrivateKey:[self getPrivateKey]];
    size_t siglen = SecKeyGetBlockSize(pKey);
    uint8_t* signedHashBytes = malloc(siglen);
    memset(signedHashBytes, 0x0, siglen);
    SecKeyRawSign(pKey,
                  kSecPaddingPKCS1SHA256,
                  outData.bytes,
                  outData.length,
                  signedHashBytes,
                  &siglen);
    NSData* signedHash = [NSData dataWithBytes:signedHashBytes length:(NSUInteger)siglen];
    NSString *signString = [signedHash base64EncodedStringWithOptions:NSUTF8StringEncoding];
    NSLog(@"=1===== %@",signString);
    if (!signString) {
        return @"";
    }
    return signString;
}

//驗籤
+(BOOL) verifySign:(NSString *)response signString:(NSString *)signString{
    // sha256加密
    NSData *outData = [self sha256:response];
    // 簽名base64解碼
    NSData *signData = [[NSData alloc] initWithBase64EncodedString:signString options:NSDataBase64DecodingIgnoreUnknownCharacters];
    // 簽名驗證
    SecKeyRef pKey = [RSA addPrivateKey:[self getServicePublicKey]];
    size_t siglen = SecKeyGetBlockSize(pKey);
    const void* signedHashBytes = [signData bytes];
    OSStatus status = SecKeyRawVerify(pKey,
                                      kSecPaddingPKCS1SHA256,
                                      outData.bytes,
                                      outData.length,
                                      signedHashBytes,
                                      siglen);

    return status == errSecSuccess;
    
}


+ (NSData *) sha256:(NSString *)str {
    const char *s = [str cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *strData = [NSData dataWithBytes:s length:strlen(s)];
    uint8_t digest [CC_SHA256_DIGEST_LENGTH] = {0};
    CC_SHA256(strData.bytes, (CC_LONG)strData.length, digest);
    NSData *data = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    return data;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章