『壹』 iOS RSA加密生成公鑰私鑰
該命令生成一個模長 2048 位,名字為 rsa_private_key.pem 、 PKCS1 格式的 RSA 私鑰文件.
genrsa :指定生成演算法使用 RSA
-out :後面參數是生成的私鑰的文件名
2048 :生成私鑰的模長,單位位元組(bits)
根據生成的私鑰 rsa_private_key.pem 文件,生成公鑰 rsa_public_key.pem 文件
生成名字為 rsa_pkcs8_private_key.pem 的私鑰文件
Java 和 android 用到的密鑰:
公鑰: rsa_public_key.pem
私鑰: rsa_pkcs8_private_key.pem
終端會提示輸入國家、省市、所在地、組織、組織單位、常用名稱、郵箱地址等信息,按要求填寫(可以隨便填寫), 輸入完對應信息後會提示輸入一個密碼 :
最終會生成 rsacert.csr 文件
用最開始生成的私鑰 rsa_private_key.pem 和 rsacert.csr 證書請求文件生成一個數字證書 rsacert.crt
使用 x509 工具自建CA。由於 x509 無法建立證書請求文件,所以只能使用 openssl req 來生成請求文件,然後使用 x509 來自簽署, 也可以用來簽署他人的證書請求,即為他人頒發證書。
知識點 :
終端會提示設置密碼,該密碼是 .p12 私鑰的密碼(用 private_key.p12 私鑰解密時, 要用到該密碼, 需要記錄下 ), 會提示再次輸入檢驗剛才輸入的密碼.
『貳』 ios怎麼實現RAS加密解密
轉載最近幾天折騰了一下如何在iOS上使用RSA來加密。iOS上並沒有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我們可以通過製作自簽名的x509證書(由於對安全性要求不高,我們並不需要使用CA認證的證書),再調用x509的相關API來進行加密。接下來記錄一下整個流程。
第一步,製作自簽名的證書
1.最簡單快捷的方法,打開Terminal,使用openssl(Mac OS X自帶)生成私鑰和自簽名的x509證書。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示輸入內容就行了。
幾個說明:
public_key.der是輸出的自簽名的x509證書,即我們要用的。
private_key.pem是輸出的私鑰,用來解密的,請妥善保管。
rsa:1024這里的1024是密鑰長度,1024是比較安全的,如果需要更安全的話,可以用2048,但是加解密代價也會增加。
-days:證書過期時間,一定要加上這個參數,默認的證書過期時間是30天,一般我們不希望證書這么短就過期,所以寫上比較合適的天數,例如這里的3650(10年)。
事實上,這一行命令包含了好幾個步驟(我研究下面這些步驟的原因是我手頭已經由一個private_key.pem私鑰了,想直接用這個來生成x509證書,也就是用到了下面的2-3)
1)創建私鑰
openssl genrsa -out private_key.pem 1024
2)創建證書請求(按照提示輸入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自簽署根證書
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.驗證證書。把public_key.der拖到xcode中,如果文件沒有問題的話,那麼就可以直接在xcode中打開,看到證書的各種信息。
第二步,使用public_key.der來進行加密。
1.導入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.從public_key.der讀取公鑰。
4.加密。
下面是參考代碼(只能用於加密長度小於等於116位元組的內容,適合於對密碼進行加密。使用了ARC,不過還是要注意部分資源需要使用CFRealse來釋放)
RSA.h
//
// RSA.h
//
#import <Foundation/Foundation.h>
@interface RSA : NSObject {
SecKeyRef publicKey;
SecCertificateRef certificate;
SecPolicyRef policy;
SecTrustRef trust;
size_t maxPlainLen;
}
- (NSData *) encryptWithData:(NSData *)content;
- (NSData *) encryptWithString:(NSString *)content;
@end
RSA.m
//
// RSA.m
//
#import "RSA.h"
@implementation RSA
- (id)init {
self = [super init];
NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"];
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der");
return nil;
}
NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der");
return nil;
}
certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der");
return nil;
}
policy = SecPolicyCreateBasicX509();
OSStatus returnCode = (certificate, policy, &trust);
if (returnCode != 0) {
NSLog(@" fail. Error Code: %ld", returnCode);
return nil;
}
SecTrustResultType trustResultType;
returnCode = SecTrustEvaluate(trust, &trustResultType);
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);
return nil;
}
publicKey = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail");
return nil;
}
maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;
return self;
}
- (NSData *) encryptWithData:(NSData *)content {
size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}
void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];
size_t cipherLen = 128; // 當前RSA的密鑰長度是128位元組
void *cipher = malloc(cipherLen);
OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);
NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];
}
- (void)dealloc{
CFRelease(certificate);
CFRelease(trust);
CFRelease(policy);
CFRelease(publicKey);
}
@end
使用方法:
RSA *rsa = [[RSA alloc] init];
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"]);
}
else {
NSLog(@"init rsa error");
}
『叄』 怎麼在ios中應用「RSA的私鑰加密或公鑰加密演算法」
1、用公鑰加密,用私鑰解密。 2、給別人發信息,就從伺服器上拉下來別人的公鑰,加密後發給他。 3、對方拿到信息後用自己的私鑰解密。 4、這樣,公鑰加密後除了私鑰持有人,別人都看不到信息
『肆』 iOS怎麼使用模和指數進行RSA加密
首先確認你要加密的數據有多大,如果比較大建議先使用對稱演算法進行加密,將對稱演算法的密鑰使用RSA加密即可。
現在定義:
你所拿到的公鑰模為 N,指數為E
N的位長度為 len(N)
N佔用的位元組數為 k = (len(N)+7)/8
要加密的數據為D (可以是你原始的數據或者對稱演算法密鑰)
如果你的加密數據比較小的話也可以直接進行RSA加密,比較小的意思為:被加密數據的長度必須能夠滿足填充條件,如果採用PKCS1_1.5的填充方式,D佔用的位元組要小於 k-11
運算過程很簡單: 將D進行填充到D1, 要求D1所佔用的位元組數為 k (即同N的長度相同)
則計算密文E的過程為 DE = (D1 ^ E) % N ( ^ 表示指數運算)
在程序中實現建議你採用一些現成的庫,如果有OpenSSL則可以網上搜索一下,資料應該不少。
如果沒有的話可以直接引入一些大數計算的庫直接進行模指運算(別分開,太慢)。
『伍』 RSA加密原理
RSA加密是一種非對稱加密。可以在不直接傳遞密鑰的情況下,完成解密。這能夠確保信息的安全性,避免了直接傳遞密鑰所造成的被破解的風險。是由一對密鑰來進行加解密的過程,分別稱為公鑰和私鑰。公鑰加密--私鑰解密,私鑰加密--公鑰解密
在 整數 中, 離散對數 是一種基於 同餘 運算和 原根 的一種 對數 運算。而在實數中對數的定義 log b a 是指對於給定的 a 和 b ,有一個數 x ,使得 b x = a 。相同地在任何群 G 中可為所有整數 k 定義一個冪數為 b K ,而 離散對數 log b a 是指使得 b K = a 的整數 k 。
當3為17的 原根 時,我們會發現一個規律
對 正整數 n,歐拉函數是小於或等於n的正整數中與n 互質 的數的數目(因此φ(1)=1)。有以下幾個特點
服務端根據生成一個隨機數15,根據 3 15 mod 17 計算出6,服務端將6傳遞給客戶端,客戶端生成一個隨機數13,根據 3 13 mod 17 計算出12後,將12再傳回給服務端,客戶端收到服務端傳遞的6後,根據 6 13 mod 17 計算出 10 ,服務端收到客戶端傳遞的12後,根據 12 15 mod 17 計算出 10 ,我們會發現我們通過 迪菲赫爾曼密鑰交換 將 10 進行了加密傳遞
說明:
安全性:
除了 公鑰 用到 n 和 e ,其餘的4個數字是 不公開 的(p1、p2、φ(n)、d)
目前破解RSA得到的方式如下:
缺點
RSA加密 效率不高 ,因為是純粹的數學演算法,大數據不適合RSA加密,所以我們在加密大數據的時候,我們先用 對稱加密 演算法加密大數據得到 KEY ,然後再用 RSA 加密 KEY ,再把大數據和KEY一起進行傳遞
因為Mac系統內置了OpenSSL(開源加密庫),所以我們開源直接在終端進行RSA加密解密
生成RSA私鑰,密鑰名為private.pem,密鑰長度為1024bit
因為在iOS中是無法使用 .pem 文件進行加密和解密的,需要進行下面幾個步驟
生成一個10年期限的crt證書
crt證書格式轉換成der證書
『陸』 iOS逆向(1)-密碼學(RSA)
要講逆向,那麼肯定少不了密碼學,因為所有的逆向(攻防)都是對已加密的數據進行解密。所以我們必須初步了解加密的方式有哪些,畢竟知己知彼,才能百戰百勝。
接下來,我將從以下四方面來講述密碼學相關的內容:
1、什麼是密碼學
2、RSA數學原理
3、RSA終端命令
4、總結
密碼學的歷史大致可以追溯到兩千年前,相傳古羅馬名將凱撒大帝為了防止敵方截獲情報,用密碼傳送情報。凱撒的做法很簡單,就是對二十幾個羅馬字母建立一張對應表。這樣,如果不知道密碼本,即使截獲一段信息也看不懂。
從凱撒大帝時代到上世紀70年代這段很長的時間里,密碼學的發展非常的緩慢,因為設計者基本上靠經驗。沒有運用數學原理。
在1976年以前,所有的加密方法都是同一種模式:加密、解密使用同一種演算法。在交互數據的時候,彼此通信的雙方就必須將規則告訴對方,否則沒法解密。那麼加密和解密的規則(簡稱密鑰),它保護就顯得尤其重
要。傳遞密鑰就成為了最大的隱患。這種加密方式被成為對稱加密演算法(symmetric encryption algorithm)。
1976年,兩位美國計算機學家 迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構思,可以在不直接傳遞密鑰的情況下,完成密鑰交換。這被稱為「迪菲赫爾曼密鑰交換」演算法。開創了密碼學研究的新方向。
1977年三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起設計了一種演算法,可以實現非對稱加密。這個演算法用他們三個人的名字命名,叫做RSA演算法。
也就是說「迪菲赫爾曼密鑰交換」在密碼學歷史的車輪中成為了一個轉折點。
咱們這里先把所有需要用到的公式定理列出來:
1、取模運算
2、歐拉函數φ
3、歐拉定理,費馬小定理
4、模反元素
5、迪菲赫爾曼密鑰交換
取模運算(「Molo Operation」)和取余運算(「Complementation 」)兩個概念有重疊的部分但又不完全一致。主要的區別在於對負整數進行除法運算時操作不同。
在這列出各種負數情況的例子供大家理解:
7 mod 4 = 3(商 = 1 或 2,1<2,取商=1)
-7 mod 4 = 1(商 = -1 或 -2,-2<-1,取商=-2)
7 mod -4 = -1(商 = -1或-2,-2<-1,取商=-2)
-7 mod -4 = -3(商 = 1或2,1<2,取商=1)
函數值符號規律(余數的符號) mod(負,正)=正 mod(正,負)=負
結論:兩個整數求余時,其值的符號為除數的符號。
可以簡單理解為:
如果n可以分解為 兩個互質(不一定是兩個質數) 的數之積A和B,那麼:
φ(n) = φ(A) * φ(B)
如果 A和B 又同時為質數,那麼:
φ(n) = (A-1) * (B-1)
首先這里說一下,定製之所以是定理是被人證明過的,如何證明的不管,當然你也可以增加去證明下,反正我不管(……&%¥%……&%&……&%),哈哈
如果m、n為正整數,且m、n互質,那麼:
如果n為質數,那麼:
公式轉換:
如果兩個正整數e和x互質,那麼一定可以找到整數d,使得 e*d-1 被x整除。那麼d就是e對於x的「模反元素」。
如上圖:
客戶端持有一個隨機數13 ,服務端持有隨機數15,再選一對特殊的數,3是17的原根(啥是 原根 ?)。
兩端交換的都是密文,就算中間被劫持,也不知道最後需要的傳輸的內容是10
那麼這個10就是最後真正的秘鑰。
證明過程
設
那麼:
又由於上面模反元素 最後得出
所以得出最終結論:
這個公式也就是我們最後的RSA加密公式!!!
其中:
補充:
1、n會非常大,長度一般為1024個二進制位。(目前人類已經分解的最大整數,232個十進制位,768個二進制位)
2、由於需要求出φ(n),所以根據歐函數特點,最簡單的方式n 由兩個質數相乘得到: 質數:p1、p2
Φ(n) = (p1 -1) * (p2 - 1)
3、最終由φ(n)得到e 和 d 。
總共生成6個數字:p1、p2、n、φ(n)、e、d
關於RSA的安全:
除了公鑰用到了n和e 其餘的4個數字是不公開的。
目前破解RSA得到d的方式如下:
1、要想求出私鑰 d 。由於e d = φ(n) k + 1。要知道e和φ(n);
2、e是知道的,但是要得到 φ(n),必須知道p1 和 p2。
3、由於 n=p1*p2。只有將n因數分解才能算出。
由於Mac系統內置OpenSSL(開源加密庫),所以我們可以直接在終端上使用命令來玩RSA. OpenSSL中RSA演算法常用指令主要有三個:
1、由於RSA加密解密用的不是一套數據,所以其保證了安全性。
2、由於私鑰過大,所以效率較低
3、如果有一天量子計算機被普及(計算速度極快),那麼1024位已經不足以讓RSA安全。
『柒』 RSA 加密演算法(原理篇)
前幾天看到一句話,「我們中的很多人把一生中最燦爛的笑容大部分都獻給了手機和電腦屏幕」。心中一驚,這說明了什麼?手機和電腦已經成為了我們生活中的一部分,所以才會有最懂你的不是你,也不是你男朋友,而是大數據。
如此重要的個人數據,怎樣才能保證其在互聯網上的安全傳輸呢?當然要靠各種加密演算法。說起加密演算法,大家都知道有哈希、對稱加密和非對稱加密了。哈希是一個散列函數,具有不可逆操作;對稱加密即加密和解密使用同一個密鑰,而非對稱加密加密和解密自然就是兩個密鑰了。稍微深入一些的,還要說出非對稱加密演算法有DES、3DES、RC4等,非對稱加密演算法自然就是RSA了。那麼當我們聊起RSA時,我們又在聊些什麼呢?今天筆者和大家一起探討一下,有不足的地方,還望各位朋友多多提意見,共同進步。
RSA簡介:1976年由麻省理工學院三位數學家共同提出的,為了紀念這一里程碑式的成就,就用他們三個人的名字首字母作為演算法的命名。即 羅納德·李維斯特 (Ron Rivest)、 阿迪·薩莫爾 (Adi Shamir)和 倫納德·阿德曼 (Leonard Adleman)。
公鑰:用於加密,驗簽。
私鑰:解密,加簽。
通常知道了公鑰和私鑰的用途以後,即可滿足基本的聊天需求了。但是我們今天的主要任務是來探究一下RSA加解密的原理。
說起加密演算法的原理部分,肯定與數學知識脫不了關系。
我們先來回憶幾個數學知識:
φn = φ(A*B)=φ(A)*φ(B)=(A-1)*(B-1)。
這個公式主要是用來計算給定一個任意的正整數n,在小於等於n的正整數中,有多少個與n構成互質的關系。
其中n=A*B,A與B互為質數,但A與B本身並不要求為質數,可以繼續展開,直至都為質數。
在最終分解完成後,即 φ(N) = φ(p1)*φ(p2)*φ(p3)... 之後,p1,p2,p3都是質數。又用到了歐拉函數的另一個特點,即當p是質數的時候,φp = p - 1。所以有了上面給出的歐拉定理公式。
舉例看一下:
計算15的歐拉函數,因為15比較小,我們可以直接看一下,小於15的正整數有 1、2、3、4、5、6、7、8、9、10、11、12、13、14。和15互質的數有1、2、4、7、8、11、13、14一共四個。
對照我們剛才的歐拉定理: 。
其他感興趣的,大家可以自己驗證。
之所以要在這里介紹歐拉函數,我們在計算公鑰和私鑰時候,會用到。
如果兩個正整數m 和 n 互質,那麼m 的 φn 次方減1,可以被n整除。
其中 .
其中當n為質數時,那麼 上面看到的公式就變成了
mod n 1.
這個公式也就是著名的 費馬小定理 了。
如果兩個正整數e和x互為質數,那麼一定存在一個整數d,不止一個,使得 e*d - 1 可以被x整除,即 e * d mode x 1。則稱 d 是 e 相對於 x的模反元素。
了解了上面所講的歐拉函數、歐拉定理和模反元素後,就要來一些化學反應了,請看圖:
上面這幅圖的公式變化有沒有沒看明白的,沒看明白的咱們評論區見哈。
最終我們得到了最重要的第5個公式的變形,即紅色箭頭後面的:
mod n m。
其中有幾個關系,需要搞明白,m 與 n 互為質數,φn = x,d 是e相對於x的模反元素。
有沒有看到一些加解密的雛形。
從 m 到 m。 這中間涵蓋了從加密到解密的整個過程,但是缺少了我們想要的密文整個過程。
OK,下面引入本文的第四個數學公式:
我們來看一下整個交換流程:
1、客戶端有一個數字13,服務端有一個數字15;
2、客戶端通過計算 3的13次方 對 17 取余,得到數字12; 將12發送給服務端;同時服務端通過計算3的15次方,對17取余,得到數字6,將6發送給客戶端。至此,整個交換過程完成。
3、服務端收到數字12以後,繼續計算,12的15次方 對 17取余,得到 數字10。
4、客戶端收到數字 6以後,繼續計算,6的13次方 對 17 取余,得到數字 10。
有沒有發現雙方,最終得到了相同的內容10。但是這個數字10從來沒有在網路過程中出現過。
好,講到這里,可能有些人已經恍然大悟,這就是加密過程了,但是也有人會產生疑問,為什麼要取數字3 和 17 呢,這里還牽涉到另一個數學知識,原根的問題。即3是17的原根。看圖
有沒有發現規律,3的1~16次方,對17取余,得到的整數是從1~16。這時我們稱3為17的原根。也就是說上面的計算過程中有一組原根的關系。這是最早的迪菲赫爾曼秘鑰交換演算法。
解決了為什麼取3和17的問題後,下面繼續來看最終的RSA是如何產生的:
還記得我們上面提到的歐拉定理嗎,其中 m 與 n 互為質數,n為質數,d 是 e 相對於 φn的模反元素。
當迪菲赫爾曼密鑰交換演算法碰上歐拉定理會產生什麼呢?
我們得到下面的推論:
好,到這里我們是不是已經看到了整個的加密和解密過程了。
其中 m 是明文;c 是密文; n 和 e 為公鑰;d 和 n 為私鑰 。
其中幾組數字的關系一定要明確:
1、d是e 相對於 φn 的模反元素,φn = n-1,即 e * d mod n = 1.
2、m 小於 n,上面在講迪菲赫爾曼密鑰交換演算法時,提到原根的問題,在RSA加密演算法中,對m和n並沒有原根條件的約束。只要滿足m與n互為質數,n為質數,且m < n就可以了。
OK,上面就是RSA加密演算法的原理了,經過上面幾個數學公式的狂轟亂炸,是不是有點迷亂了,給大家一些時間理一下,後面會和大家一起來驗證RSA演算法以及RSA為什麼安全。
『捌』 ios開發rsa加密怎麼生成秘鑰
1、加密解密的第一步是生成公鑰、私鑰對,私鑰加密的內容能通過公鑰解密(反過來亦可以) 下載開源RSA密鑰生成工具openssl(通常Linux系統都自帶該程序),解壓縮至獨立的文件夾,進入其中的bin目錄,執行以下命令: 代碼如下: openssl genrsa -out rsa_private_key.pem 1024 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一條命令生成原始 RSA私鑰文件 rsa_private_key.pem,第二條命令將原始 RSA私鑰轉換為 pkcs8格式,第三條生成RSA公鑰 rsa_public_key.pem 從上面看出通過私鑰能生成對應的公鑰,因此我們將私鑰private_key.pem用在伺服器端,公鑰發放給android跟ios等前端 2、php中用生成的公鑰、私鑰進行加密解密,直接上代碼 代碼如下: $fp=fopen("rsa/rsa_private_key.pem","r"); //你的私鑰文件路徑 $private_key=fread($fp,8192); fclose($fp); $fp1=fopen("rsa/rsa_public_key.pem","r"); //你的公鑰文件路徑 $public_key=fread($fp1,8192); fclose($fp1); //echo $private_key; $pi_key=openssl_pkey_get_private($private_key);//這個函數可用來判斷私鑰是否是可用的,可用返回資源id Resource id $pu_key=openssl_pkey_get_public($public_key );//這個函數可用來判斷公鑰是否是可用的 print_r($pi_key);echo "n"; echo "<br>"; print_r($pu_key);echo "n"; echo "<br>"; echo "<hr>"; $data='php ras加密演算法'; $encrypted = ""; $decrypted = ""; echo "加密的源數據:".$data."n"; echo "<br>"; echo "private key encrypt:n"; echo "<br>"; openssl_private_encrypt($data,$encrypted,$pi_key);//私鑰加密 $encrypted = base64_encode($encrypted);//加密後的內容通常含有特殊字元,需要編碼轉換下,在網路間通過url傳輸時要注意base64編碼是否是url安全的 echo '私鑰加密後:'.$encrypted."n"; echo "<br>";echo "<br>"; echo "public key decrypt:n"; echo "<br>"; openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私鑰加密的內容通過公鑰可用解密出來 echo '公鑰解密後:'.$decrypted."n"; echo "<br>"; echo "<hr>"; echo "public key encrypt:n"; echo "<br>"; openssl_public_encrypt($data,$encrypted,$pu_key);//公鑰加密 $encrypted = base64_encode($encrypted); echo $encrypted,"n"; echo "<br>"; echo "private key decrypt:n"; echo "<br>"; openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私鑰解密 echo $decrypted,"n"; echo "<br>"; PHP的RSA配置常見問題: ●PHP開發語言的代碼示例中openssl文件夾中的3個DLL文件用法 1、如果你的系統是windows系統,且system32文件目錄下沒有libeay32.dll、ssleay32.dll這兩個文件 那麼需要拷貝這兩個文件到system32文件目錄。 2、如果您的php安裝目錄下(phpext)中沒有php_openssl.dll 那麼請把php_openssl.dll放在這個文件夾中 喜歡加密解密的小夥伴一定要好好看看這篇文章,受益匪淺。。。
『玖』 IOS中怎麼做RSA加密演算法
RSA加密以及解密實現步驟:
1、使用openssl生成密匙對。
代碼如下:(代碼源於github開源社區)
#!/usr/bin/envbash
echo"GeneratingRSAkeypair..."
echo"1024RSAkey:private_key.pem"
opensslgenrsa-outprivate_key.pem1024
echo":rsaCertReq.csr"
opensslreq-new-keyprivate_key.pem-outrsaCertReq.csr
echo"createcertificationusingx509:rsaCert.crt"
opensslx509-req-days3650-inrsaCertReq.csr-signkeyprivate_key.pem-outrsaCert.crt
echo"createpublic_key.derForIOS"
opensslx509-outformder-inrsaCert.crt-outpublic_key.der
echo"createprivate_key.p12ForIOS.Pleaserememberyourpassword.ThepasswordwillbeusediniOS."
opensslpkcs12-export-outprivate_key.p12-inkeyprivate_key.pem-inrsaCert.crt
echo"creatersa_public_key.pemForJava"
opensslrsa-inprivate_key.pem-outrsa_public_key.pem-pubout
echo"createpkcs8_private_key.pemForJava"
opensslpkcs8-topk8-inprivate_key.pem-outpkcs8_private_key.pem-nocrypt
echo"finished."
2、載入證書後即可進行加密演算法。
代碼:
RSAEncryptor*rsa=[[RSAEncryptoralloc]init];
NSLog(@"encryptorusingrsa");
NSString*publicKeyPath=[[NSBundlemainBundle]pathForResource:@"public_key"ofType:@"der"];
NSLog(@"publickey:%@",publicKeyPath);
[rsaloadPublicKeyFromFile:publicKeyPath];
NSString*securityText=@"hello~";
NSString*encryptedString=[rsarsaEncryptString:securityText];
NSLog(@"encrypteddata:%@",encryptedString);
對應解密代碼:
NSLog(@"decryptorusingrsa");
[rsaloadPrivateKeyFromFile:[[NSBundlemainBundle]pathForResource:@"private_key"ofType:@"p12"]password:@"123456"];
NSString*decryptedString=[rsarsaDecryptString:encryptedString];
NSLog(@"decrypteddata:%@",decryptedString);
RSA基本原理:
RSA使用"秘匙對"對數據進行加密解密.在加密解密數據前,需要先生成公鑰(public key)和私鑰(private key)。
公鑰(public key): 用於加密數據. 用於公開, 一般存放在數據提供方, 例如iOS客戶端。
私鑰(private key): 用於解密數據. 必須保密, 私鑰泄露會造成安全問題。