前言
關(guān)于用Rsa 非對(duì)稱(chēng)算法進(jìn)行加解密,處了常規(guī)的生成公私鑰密鑰對(duì)外截驮,還有一種方式就是通過(guò)指數(shù)與模的形式取得公鑰或者私鑰對(duì)象笑陈,從而進(jìn)行加解密計(jì)算。
常用加解密情形
android端和服務(wù)端是如何使用指數(shù)和模進(jìn)行數(shù)據(jù)的加解密?
主要有以下幾種形式:
A.服務(wù)端根據(jù)客戶端的特殊請(qǐng)求(可以是雙方規(guī)定的請(qǐng)求每天第一次請(qǐng)求之類(lèi)的動(dòng)作)隨機(jī)動(dòng)態(tài)生成一組加密的公私鑰的指數(shù)和模葵袭,并且將公鑰或者私鑰的指數(shù)和模通過(guò)加密的方式傳遞給客戶端(可以是3des-cbc或者其他可靠的加密方式涵妥,保障秘鑰信息的安全性)。然后客戶端每次通訊都用解密后端公鑰或者私鑰對(duì)象進(jìn)行加解密服務(wù)端的數(shù)據(jù)坡锡。
以上所述的場(chǎng)景一般都是用在銀聯(lián)pos端下發(fā)主秘鑰的情形蓬网。
主要流程如下:
其中1,2個(gè)步奏是關(guān)鍵,部分公司 采用的方式都是客戶端生成8*N字節(jié)的隨機(jī)數(shù)上傳給服務(wù)端生成公私鑰對(duì)鹉勒,客戶端就行3des或者des 的cbc模式界面帆锋,具體看服務(wù)端和客戶端的協(xié)議
B.請(qǐng)各位補(bǔ)充..........
遇到的坑
當(dāng)然今天講的并不是以上的知識(shí)點(diǎn),在這邊記錄下遇到的坑給那些受到傷害的同行一些參考禽额。
坑:
1.指數(shù)和模(這個(gè)是16進(jìn)制的)獲取錯(cuò)誤锯厢。
2.填充方式錯(cuò)誤皮官,除了常見(jiàn)的rsa填充還有其他的填充方式,例如:
代碼示例
獲取公鑰對(duì)象或者是私有對(duì)象实辑,這邊代碼顯示的是獲取公鑰對(duì)象
public static RSAPublicKey getPublicKey(String modulus, String exponent) {
try {
BigInteger b1 = new BigInteger(modulus, 16); //此處為16進(jìn)制數(shù)捺氢,模
BigInteger b2 = new BigInteger(exponent, 16); //此處為16進(jìn)制數(shù),指數(shù)
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
return (RSAPublicKey) keyFactory.generatePublic(keySpec);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
公鑰解密方式
//加密填充方式,列舉常用的3種
public static final String KEY_ALGORITHM = "RSA";
public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";
public static final String TRANSFORMATION = "RSA/ECB/NoPadding";
public static String decryptByPublicKey(String data, String modules, String component)
throws Exception {
RSAPublicKey pubKey = RSAUtils.getPublicKey(modules, component);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, pubKey);
byte[] b = cipher.doFinal(Convert.str2Bcd(data));
return Convert.bcd2Str(mainkey);
}
遇到的坑主要是這邊的填充方式填充錯(cuò)誤剪撬,由于某種原因服務(wù)端的填充方式獲取不到摄乒,所以只能一個(gè)個(gè)測(cè)試過(guò)去。填充方式也是尋求幫助后才找到的婿奔,希望對(duì)大家有用缺狠。
工具類(lèi)bcd2Str代碼(16進(jìn)制字節(jié)數(shù)組轉(zhuǎn)字符串)
public static String bcd2Str(byte[] b) {
char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
StringBuilder sb = new StringBuilder(b.length * 2);
for (int i = 0; i < b.length; ++i) {
sb.append(HEX_DIGITS[((b[i] & 0xF0) >>> 4)]);
sb.append(HEX_DIGITS[(b[i] & 0xF)]);
}
return sb.toString();
}
關(guān)于怎么創(chuàng)建模和指數(shù)
請(qǐng)參考這篇文章:
https://my.oschina.net/mywiki/blog/1613886