突然發現接收百度資源太多了,我也回饋一下吧。
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;
}