iOS開(kāi)發(fā)加解密算法-基礎(chǔ)篇(4) RSA的加解密<java端加密,iOS解密>

一着绷、突然發(fā)現(xiàn)少寫(xiě)了一個(gè)RSA - -#...,加解密原理參照RSA算法原理笨使,常規(guī)的加解算法一般都是對(duì)稱加密:

(1)甲方選擇某一種加密規(guī)則棠笑,對(duì)信息進(jìn)行加密
(2)乙方使用同一種規(guī)則容劳,對(duì)信息進(jìn)行解密辉词。
由于加密和解密使用同樣規(guī)則(簡(jiǎn)稱"密鑰")必孤,這被稱為"對(duì)稱加密算法"(Symmetric-key algorithm)。
這種加密模式有一個(gè)最大弱點(diǎn):甲方必須把加密規(guī)則告訴乙方瑞躺,否則無(wú)法解密敷搪。保存和傳遞密鑰,就成了最頭疼的問(wèn)題幢哨。
常用的是AES如:iOS開(kāi)發(fā)加解密算法-基礎(chǔ)篇(2)<AES加密算法>

而RSA是非對(duì)稱加密:

(1)乙方生成兩把密鑰(公鑰和私鑰)赡勘。公鑰是公開(kāi)的,任何人都可以獲得捞镰,私鑰則是保密的闸与。
(2)甲方獲取乙方的公鑰毙替,然后用它對(duì)信息加密。
(3)乙方得到加密后的信息践樱,用私鑰解密厂画。
如果公鑰加密的信息只有私鑰解得開(kāi),那么只要私鑰不泄漏拷邢,通信就是安全的袱院。

特點(diǎn)

A.便于理解,使用廣泛
RSA算法是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法瞭稼,也易于理解和操作忽洛。RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)今的三十多年里环肘,經(jīng)歷了各種攻擊的考驗(yàn)欲虚,逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一悔雹。
B.缺點(diǎn)與不足:加密和解密花費(fèi)時(shí)間長(zhǎng)苍在、速度慢,只適合對(duì)少量數(shù)據(jù)進(jìn)行加密荠商。
為提高保密強(qiáng)度寂恬,RSA密鑰至少為500位長(zhǎng),一般推薦使用1024位莱没。這就使加密的計(jì)算量很大初肉。為減少計(jì)算量,在傳送信息時(shí)饰躲,常采用傳統(tǒng)加密方法與公開(kāi)密鑰加密方法相結(jié)合的方式牙咏,即信息采用改進(jìn)的DES或IDEA對(duì)話密鑰加密,然后使用RSA密鑰加密對(duì)話密鑰和信息摘要嘹裂。對(duì)方收到信息后妄壶,用不同的密鑰解密并可核對(duì)信息摘要。

二寄狼、RSA的方法實(shí)現(xiàn):
1.一般移動(dòng)端的RSA加解密的公私鑰都是由服務(wù)端生成的,我們要做的其實(shí)是拿著公私鑰去做加解密的操作丁寄。

2.我們公司的項(xiàng)目使用的加解密流程是
解密流程.png

雖然RSA加密后基本無(wú)解,但是RSA不適合對(duì)大文本進(jìn)行加密,所以我們采用的是對(duì)文件采用AES加密,對(duì)AES的秘鑰進(jìn)行RSA的加密,AES秘鑰是動(dòng)態(tài)的每一個(gè)文件的秘鑰都是唯一的泊愧,RSA的私鑰在傳輸?shù)臅r(shí)候再用一層AES加密.解密的流程就是再倒著來(lái)一遍...


3.RSA解密伊磺,使用第三方加解密庫(kù)openssl
  1. 一般公私鑰都是由我們服務(wù)端提供的的(java后臺(tái)),這里遇到過(guò)坑删咱,我們當(dāng)時(shí)雙方都沒(méi)做過(guò)RSA的加解密,格子調(diào)研在自己的平臺(tái)上自己加密和解密是沒(méi)有問(wèn)題的屑埋,但是用服務(wù)端傳給我們的私鑰解密他們的加密文本卻不能解密。最后發(fā)現(xiàn)原來(lái)生成的跨平臺(tái)的私鑰不能直接使用,需要進(jìn)行統(tǒng)一的編碼處理后才能使用痰滋,我們采用的是統(tǒng)一的PKCS#8編碼處理后生成的.pem格式摘能⌒拢可以參考:Java中使用OpenSSL生成的RSA公私鑰進(jìn)行數(shù)據(jù)加解密

2.秘鑰文本
AES秘鑰經(jīng)過(guò)RSA加密后的Base64字符串<code>
key = eY4bZZsiqDCsNgHVaT5OJfDkGp5pNlJbYUUPOTauXO5Yz9szXgz1XOmjTq8aoPnHTkuh1GCSF/hj0g182U2iUTZFIwRoL7MZ/LtuTpwDMaa3XHAOjvTqxfHKy3htd9gpR/2/w9+l9urm2MPS31GD/ZalX8GGBltDVNZWXj0zyX4=;</code>
RSA私鑰經(jīng)過(guò)PKCS#8編碼處理后獲取的私鑰字符串:
<code>
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCWWQqoCxHmu9yklZ7DAME9lvw0t37SqBhIcvnma7Rl3kTn4lfJ
WEoycvNmduhf59g193c8/4tQKs/B71OUIDWfASNhnaBVzyHXTupeUSo5yaXYdSja
VIhc/HmSms1SqlsDWBzJldi0JVaN5MqNnitHpxPOBHEu6J3Xr+Cobkd1XwIDAQAB
AoGAVHmtQiQOJ92QKK2kqZ6H9SobhSdAy+4EzthDT1Ne5gnQH5YOiyPfdJ8f4YeY
IyLqWdA0oAJZbW7Qkv/8rvK2DUbH97LkeGOuJtY5SxmbWI0w7fGvefg9TPrDSyRq
PWvohEZSM2w7slhHTiPFeiRFIEmuWGTJAcnmPLAraxn5QTkCQQDWfX4ybSk5mX9y
iSt952C78c80bX54XW9VMCnDIFGDkSsG3zyXlI4i3PJAXYHFwzcysD0irxQPVjTA
7k6b1eflAkEAs3G8mxCAbuqbzw7zuJUgMshns2tD5BIH8/7DwhRl/ecz6Az6SQ6Q
ZF02XpDyqpNtllwc2WDIyTE7go33bNeL8wJBALYb6Hix/A1+iRna4sVMHPKV1QJD
cNyLIAqpENwt5Weaani0MwLTy3ZIN5p0ick5/PSZc96t3Y9D9xhTfQSMsg0CQFlC
wmcAFmMWINsmvOWciJ+6QJtnSCYzMfGVURtBulpKn+9WRUoCDKFgHKN9xrhDDcg1
mcQn+Ljb3JZcuC9UKTECQQCRCHnaY7sp3hIizdIRN5lI0vhyipVVIymTTgmtu7rV
LrnmEEas1RhUVOyVJaw08mON/eH17//9X29cA9ntFSLh
-----END RSA PRIVATE KEY-----
</code>


4.代碼實(shí)現(xiàn)

a.將私鑰寫(xiě)入到本地后綴名不限制

 NSString *path  = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@".private_key.rce"];
 NSFileManager *manger = [NSFileManager defaultManager];
                    [manger removeItemAtPath:path error:nil];
 NSError *error = nil;
BOOL success = [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];

b.將私鑰導(dǎo)入

//根據(jù)鑰匙類型導(dǎo)入公鑰私鑰
- (BOOL)importRSAKeyWithType:(KeyType)type {
    FILE *file;
    if (type == KeyTypePublic) {
        file = fopen([OpenSSLRSAPublicKeyFile cStringUsingEncoding:NSASCIIStringEncoding],"rb");
    }else{
        file = fopen([OpenSSLRSAPrivateKeyFile1 cStringUsingEncoding:NSASCIIStringEncoding],"rb");
    }
    if (NULL != file) {
        if (type == KeyTypePublic) {
            _rsa = PEM_read_RSAPublicKey(file,NULL, NULL, NULL);
            assert(_rsa != NULL);
            // PEM_write_RSAPublicKey(stdout, _rsa);
        }else{
            _rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL);
            assert(_rsa != NULL);
            PEM_write_RSAPrivateKey(stdout, _rsa, NULL, NULL, 0, NULL, NULL);
        }
        fclose(file);
        return (_rsa != NULL)?YES:NO;
    } return NO;
}

c.導(dǎo)入完成后對(duì)加密二進(jìn)制流進(jìn)行解密

- (NSData*)decryptRSAKeyWithType:(KeyType)keyType paddingType:(RSA_PADDING_TYPE)padding encryptedData:(NSData*)data {
    if (data && [data length]) {
        NSUInteger flen = [data length];
        unsigned char from[flen];
        bzero(from, sizeof(from));
        memcpy(from, [data bytes], [data length]);
        
// 這里可以更改解密密文長(zhǎng)度
        unsigned char to[32];
        bzero(to, sizeof(to));
        
        [self decryptRSAKeyWithType:keyType :from :flen :to :padding];
        NSData *data = [NSData dataWithBytes:to length:sizeof(to)];
        [[NSFileManager defaultManager] removeItemAtPath:OpenSSLRSAPrivateKeyFile1 error:nil];
        return data;
    }
    return nil;
}
- (NSData *)decryptRSAKeyWithType:(KeyType)keyType paddingType:(RSA_PADDING_TYPE)padding encryptedData:(NSData *)data andKeyName:(NSString *)name {
    [self importRSAKeyWithType:KeyTypePrivate keyName:name];
    if (data && [data length])
    {
        NSUInteger flen = [data length];
        unsigned char from[flen];
        bzero(from, sizeof(from));
        memcpy(from, [data bytes], [data length]);
        
        unsigned char to[32];
        bzero(to, sizeof(to));
        
        [self decryptRSAKeyWithType:keyType :from :flen :to :padding];
        return [NSData dataWithBytes:to length:sizeof(to)];
    }
    return nil;
}
三、完团搞,如有不當(dāng)之處歡迎指正袜刷。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市莺丑,隨后出現(xiàn)的幾起案子著蟹,更是在濱河造成了極大的恐慌,老刑警劉巖梢莽,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萧豆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昏名,警方通過(guò)查閱死者的電腦和手機(jī)涮雷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轻局,“玉大人洪鸭,你說(shuō)我怎么就攤上這事÷仄耍” “怎么了览爵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)镇饮。 經(jīng)常有香客問(wèn)我蜓竹,道長(zhǎng),這世上最難降的妖魔是什么储藐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任俱济,我火速辦了婚禮,結(jié)果婚禮上钙勃,老公的妹妹穿的比我還像新娘蛛碌。我一直安慰自己,他們只是感情好辖源,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蔚携。 她就那樣靜靜地躺著,像睡著了一般同木。 火紅的嫁衣襯著肌膚如雪浮梢。 梳的紋絲不亂的頭發(fā)上跛十,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天彤路,我揣著相機(jī)與錄音,去河邊找鬼芥映。 笑死洲尊,一個(gè)胖子當(dāng)著我的面吹牛远豺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坞嘀,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼躯护,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丽涩?” 一聲冷哼從身側(cè)響起棺滞,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矢渊,沒(méi)想到半個(gè)月后继准,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矮男,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年移必,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毡鉴。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崔泵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猪瞬,到底是詐尸還是另有隱情憎瘸,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布陈瘦,位于F島的核電站含思,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏甘晤。R本人自食惡果不足惜含潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望线婚。 院中可真熱鬧遏弱,春花似錦、人聲如沸塞弊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)游沿。三九已至饰抒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诀黍,已是汗流浹背袋坑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眯勾,地道東北人枣宫。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓婆誓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親也颤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洋幻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容