iOS RSA加密與解密 簽名與驗簽(附Java端處理)

本篇文章將涉及以下幾個操作:
1劳景、iOS端使用RSA公鑰加密,iOS端使用RSA私鑰解密柄沮。
2回梧、iOS端使用RSA私鑰加簽,iOS端使用RSA公鑰驗簽祖搓。
3狱意、iOS端使用RSA公鑰加密,Java端使用RSA私鑰解密拯欧。
4详囤、iOS端使用RSA私鑰加簽,Java端使用RSA公鑰驗簽镐作。

首先藏姐,RSA公鑰私鑰對,我是由Java端生成的该贾。拿到測試的密鑰之后羔杨,我在iOS端使用時,添加私鑰失敗杨蛋,報錯是-50兜材。我后來查了一下資料,得知逞力,Java的文件密鑰格式是PKCS8曙寡,而iOS需要使用PKCS1格式。這就需要進(jìn)行一次轉(zhuǎn)換掏击,操作步驟如下:
1卵皂、打開一個文本編輯器(我使用的是Sublime),將Java端給到的私鑰拷貝進(jìn)來砚亭,并在首行添加"-----BEGIN PRIVATE KEY-----"灯变,在末行添加"-----END PRIVATE KEY-----",完成后的效果是這樣的:

-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIYKYkvsosqWTaweZPkY6UjD1wWoSHB+FNoaquoNGfWN8JEOH2ml76ZpuIK+y3qMfkxsJUxUZqpwvKu3MJMBYSyPsYsa9ifROektzGvbDgN//+QYsekafw6v3R+fhIr4+S7k9f3hfZa0DyiylqCZzP/5jRYygdCXm1GzbptZRdrVAgMBAAECgYARlts/S1Yxb3fR1ks5xOMYAVr+Cw82c9UYqdczz3RQnMeswUWt/3BrTgRAY/kfo8APF0HtukWeqByaC/f70nqFxbN4DnLiGsHQRKbFt2dPFV+333M7UIDYgb7Y5fmHmArFZ4ezY+WC24sSsu4+A836d0mfGjSIa03TUH8XI6X5IQJBAMfjcGC2l+TKQLQWODeJEAH2q8SoPsN6BzYUNlPMMJcVoyeqxzy/X/YcLqgdrZD+WrX8g6Y3+RkaRJ/CScDW+RMCQQCrqu0vkEZooNzpbX+o2NJAZL9gzgxXnDe9rH53OjYjbQdD7cacYZ1ZRxehL8/3itPIUy4tZpQbA5e5WL4bBQF3AkAyu914DqA658LIcqNOJTG07eDnBzT29HAEH9kyJ69liY5hsQzktEYs9zY4YV/+XzCy5Cad97L31hz4151UnruVAkBr0zSfh3NyDHg1dj2VBHsrTxyV5VYDQXARhuL4aGvQ3I6PsC3r07RNe0XwTGPIDD7xuK1sft3QCfWmyYK+3eoJAkEAnRxTqRFDbHLejtgLvgjIL52IAURRrliRbN9iyy4t1YqyfOHC7EF/Np11DoVGiBQZrbnPtI7OnNalfIf/l1cTKg==
-----END PRIVATE KEY-----

2捅膘、將這個文本存為pkcs8.pem添祸,放在桌面。
3寻仗、打開終端刃泌,執(zhí)行如下命令:

openssl rsa -in pkcs8.pem -out pkcs1.pem

完成后效果如下:


pkcs8轉(zhuǎn)換

使用cat命令可以看到轉(zhuǎn)換后的內(nèi)容,我們需要把這個內(nèi)容拷貝出來,這是我們需要的私鑰耙替。

接下來就是iOS端的加密與解密代碼:

- (void)testEncryptAndDecrypt

{

    NSString *string = [NSString stringWithFormat:@"name=wql&age=12&userId=10000&nickname=Kayle"];

    //加密時密鑰不需要轉(zhuǎn)換

    NSString *publicKey = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ24IhJQ54nOYQjl49j9lmwUaJJs9RMoyOwfcEmyXrzKE50XyT3IUxYmfB65Zo4PTHb5OndJQnoJfabvHZVeNKj+9Tmi2BXMnQh3BEN2a6HRXBnkySUbLMf9stHrcoOvDsJrZ0PLA1oIZHEoLyKZD/NFqwA0Xng+Rjtf/o14FvIQIDAQAB";

    NSString *privateKey = @"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAInbgiElDnic5hCOXj2P2WbBRokmz1EyjI7B9wSbJevMoTnRfJPchTFiZ8Hrlmjg9Mdvk6d0lCegl9pu8dlV40qP71OaLYFcydCHcEQ3ZrodFcGeTJJRssx/2y0etyg68OwmtnQ8sDWghkcSgvIpkP80WrADReeD5GO1/+jXgW8hAgMBAAECgYBCkMCT+o2zRad9ZREyTqxeBoNlpFzEy1C9egEpszSrWEKdZX7u8rNJtkd9hqE5AS6QwlqcqBkFzXClo56aH/PAjIF/2dAhAhrdvNABrxB2h/PdUkTL5XCck1TNy04jzUgxULW/7BScQ0K68A7LNu7282ZzhIG0tYF0aCBObsLE8QJBANuC/iQIoT4aOrhMDwcHeRajgQrB7TekAw1BmOoXOGqzVOHl08b6Gv/NaYXM9QUwK84thpobjApl9+RTZ83jSm0CQQCgxdX9JVibTSRxKjj3XtxiqHnA6n+9zmiZAcgsV2Uo7bMnqsUPJ0CkgAZ4JA5DIDrni1wDM1O9NCRPH7SiKAcFAkBhaVkUbov3fjZOsNn+WY+fv0E1n+eASJVeHZ0ZTOKpXxmtAYuggj7XA7XvPYwCGGVoIoXX/59+wc9nEKhBErtlAkBbJk7gKuBFjELw9eM+PEXumV4OBeVOk0uyE9SNby8nOTytbKA0qyh3Gy6PxsFfRVKgG96a4erEBl/fjDY5CUCRAkEAkZh2Gl1QEnEO2SR/hNnKI60KpGWzt0JNva2EvUZV8eChK8LUqLktggM3M6BOV0jSxpP6YKM+X3eZeFpgvUO4iA==";

    NSLog(@"加密前:%@",string);

    //加密

    NSString *encryptString = [RSAEncryptor encryptString:string publicKey:publicKey];

    NSLog(@"加密后:%@",encryptString);

    //本地解密

    NSString *decryptString = [RSAEncryptor decryptString:encryptString privateKey:privateKey];

    NSLog(@"解密后:%@",decryptString);

    NSMutableDictionary *param = [NSMutableDictionary dictionary];

    [param setObject:encryptString forKey:@"data"];

    //后端解密

    [self requestWithParam:param withUrlString:@"[http://localhost:8080/api/v1.0/testAPI4](http://localhost:8080/api/v1.0/testAPI4)"];

}

iOS端的簽名與驗簽:

- (void)testSignAndVerify{

    NSString *origin = @"1234567890";

    //簽名時 私鑰需要是pkcs1格式亚侠,轉(zhuǎn)換一下才可以使用

    NSString *privateKey = @"MIICXAIBAAKBgQCGCmJL7KLKlk2sHmT5GOlIw9cFqEhwfhTaGqrqDRn1jfCRDh9ppe+mabiCvst6jH5MbCVMVGaqcLyrtzCTAWEsj7GLGvYn0TnpLcxr2w4Df//kGLHpGn8Or90fn4SK+Pku5PX94X2WtA8ospagmcz/+Y0WMoHQl5tRs26bWUXa1QIDAQABAoGAEZbbP0tWMW930dZLOcTjGAFa/gsPNnPVGKnXM890UJzHrMFFrf9wa04EQGP5H6PADxdB7bpFnqgcmgv3+9J6hcWzeA5y4hrB0ESmxbdnTxVft99zO1CA2IG+2OX5h5gKxWeHs2PlgtuLErLuPgPN+ndJnxo0iGtN01B/FyOl+SECQQDH43BgtpfkykC0Fjg3iRAB9qvEqD7Degc2FDZTzDCXFaMnqsc8v1/2HC6oHa2Q/lq1/IOmN/kZGkSfwknA1vkTAkEAq6rtL5BGaKDc6W1/qNjSQGS/YM4MV5w3vax+dzo2I20HQ+3GnGGdWUcXoS/P94rTyFMuLWaUGwOXuVi+GwUBdwJAMrvdeA6gOufCyHKjTiUxtO3g5wc09vRwBB/ZMievZYmOYbEM5LRGLPc2OGFf/l8wsuQmnfey99Yc+NedVJ67lQJAa9M0n4dzcgx4NXY9lQR7K08cleVWA0FwEYbi+Ghr0NyOj7At69O0TXtF8ExjyAw+8bitbH7d0An1psmCvt3qCQJBAJ0cU6kRQ2xy3o7YC74IyC+diAFEUa5YkWzfYssuLdWKsnzhwuxBfzaddQ6FRogUGa25z7SOzpzWpXyH/5dXEyo=";

    //對數(shù)據(jù)進(jìn)行加密

    NSString *sign = [RSAEncryptor sign:origin withPriKey:privateKey];

    NSLog(@"簽名:%@",sign);

    //后臺驗簽

    [self requestWithParam:@{@"sign":sign==nil?@"":sign} withUrlString:@"[http://localhost:8080/api/v1.0/testAPI3](http://localhost:8080/api/v1.0/testAPI3)"];

    //本地驗簽

    NSString *publicKey = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGCmJL7KLKlk2sHmT5GOlIw9cFqEhwfhTaGqrqDRn1jfCRDh9ppe+mabiCvst6jH5MbCVMVGaqcLyrtzCTAWEsj7GLGvYn0TnpLcxr2w4Df//kGLHpGn8Or90fn4SK+Pku5PX94X2WtA8ospagmcz/+Y0WMoHQl5tRs26bWUXa1QIDAQAB";

    BOOL success = [RSAEncryptor verify:origin signature:sign withPublivKey:publicKey];

    NSLog(@"是否驗證成功:%@",success?@"YES":@"NO");

}

核心代碼在RSAEncryptor文件中。

然后是Java端驗簽:

@RequestMapping(value = "api/v1.0/testAPI3", method = RequestMethod.GET)
public Object queryThree(@RequestParam(value = "sign",required = true)String signStr){
    String string = "1234567890";
    boolean success = RSAUtil.verifyIdentify(string,signStr);
    System.out.println("驗證成功俗扇?======="+(success?"YES":"NO"));
    return success;
}

Java端解密:

@RequestMapping(value = "api/v1.0/testAPI4", method = RequestMethod.GET)
public Object queryFour(@RequestParam(value = "data",required = true)String dataString){
    String decryptData = RSAUtil.decrypt(dataString);
    System.out.println("解密結(jié)果:"+decryptData);
    return decryptData;
}

核心代碼在RSAUtil中硝烂。

接下來是iOS端本地效果:


iOS本地效果

Java端的驗簽與解密效果:


Java端效果

可以看到我們的簽名與驗簽是通過了,解密的數(shù)據(jù)Java端也是成功拿到了铜幽。
代碼在這里(含Java的核心代碼)
加油~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滞谢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子除抛,更是在濱河造成了極大的恐慌狮杨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件到忽,死亡現(xiàn)場離奇詭異橄教,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喘漏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門颤陶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陷遮,你說我怎么就攤上這事】呀” “怎么了帽馋?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長比吭。 經(jīng)常有香客問我绽族,道長,這世上最難降的妖魔是什么衩藤? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任吧慢,我火速辦了婚禮,結(jié)果婚禮上赏表,老公的妹妹穿的比我還像新娘检诗。我一直安慰自己,他們只是感情好瓢剿,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布逢慌。 她就那樣靜靜地躺著,像睡著了一般间狂。 火紅的嫁衣襯著肌膚如雪攻泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音忙菠,去河邊找鬼何鸡。 笑死,一個胖子當(dāng)著我的面吹牛牛欢,可吹牛的內(nèi)容都是我干的骡男。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氢惋,長吁一口氣:“原來是場噩夢啊……” “哼洞翩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起焰望,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骚亿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熊赖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體来屠,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年震鹉,在試婚紗的時候發(fā)現(xiàn)自己被綠了俱笛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡传趾,死狀恐怖迎膜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浆兰,我是刑警寧澤磕仅,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站簸呈,受9級特大地震影響榕订,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜕便,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一劫恒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轿腺,春花似錦两嘴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至决侈,卻和暖如春螺垢,著一層夾襖步出監(jiān)牢的瞬間喧务,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工枉圃, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留功茴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓孽亲,卻偏偏與公主長得像坎穿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子返劲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355