一残拐、RSA算法
1.簡(jiǎn)介
RSA算法是一種非對(duì)稱加密算法涎拉,也就是加密用的鑰匙和解密用的鑰匙瑞侮,并不是同一把鑰匙。非對(duì)稱加密首先會(huì)創(chuàng)建兩把鑰匙鼓拧,而這兩把鑰匙是成對(duì)的半火,分別稱為公鑰和私鑰。加密時(shí)我們使用公鑰進(jìn)行加密季俩,而在解密時(shí)必須使用私鑰才能進(jìn)行解密钮糖,這就是非對(duì)稱加密算法。
假如使用非對(duì)稱加密种玛,甲(客戶端)發(fā)送消息給乙(服務(wù)端)藐鹤,這時(shí)候乙(服務(wù)端)會(huì)預(yù)先創(chuàng)建好兩把鑰匙瓤檐,私鑰乙(服務(wù)端)自己保存好,然后把公鑰發(fā)送給甲(客戶端)娱节,甲(客戶端)使用公鑰對(duì)信息加密挠蛉,然后傳給乙(服務(wù)端),最后乙(服務(wù)端)使用自己的私鑰對(duì)數(shù)據(jù)進(jìn)行解密肄满。
這個(gè)過(guò)程中谴古,公鑰還是有可能被第三者所截獲,但是不同的是稠歉,這個(gè)第三者縱然得到了公鑰掰担,也無(wú)法解開(kāi)密文,因?yàn)榻饷苊芪乃枰乃借€從始至終一直在乙(服務(wù)端)的手里怒炸。因此這個(gè)過(guò)程是安全的带饱。
二、AES算法
1.簡(jiǎn)介
AES算法是一種對(duì)稱加密算法阅羹,原文經(jīng)過(guò)了一把鑰匙(密鑰)加密后變成了密文勺疼,然后將密文傳遞給接收方,接收方再用這把鑰匙(密鑰)解開(kāi)密文捏鱼。這個(gè)過(guò)程中执庐,加密和解密使用的是同一把鑰匙,這種加密方式稱為對(duì)稱加密导梆。
AES加密方式比DES加密更安全轨淌,但是速度比不上DES,但在不同運(yùn)行環(huán)境下能保持良好的性能看尼。
2.AES加密模式
2.1.AES一共有5種加密模式:
1.ECB(Electronic Code Book) 電碼本模式
2.CBC(Cipher Block Chaining) 密碼分組鏈接模式
3.CFB(Cipher FeedBack Mode) 密碼反饋模式(較復(fù)雜)
4.OFB(Output FeedBack) 輸出反饋模式(較復(fù)雜)
5.CTR(Counter) 計(jì)數(shù)器模式(不常見(jiàn))
其中ECB.CBC.CTR為塊加密模式递鹉;CFB.OFB為流加密模式
2.2.詳細(xì)介紹
1.ECB電碼本模式:
這種模式是將整個(gè)明文分成若干段相同的小段,然后對(duì)每一小段進(jìn)行加密狡忙。
2.CBC密碼分組鏈接模式:
這種模式是先將明文切分成若干小段梳虽,然后每一小段與初始?jí)K或者上一段的密文段進(jìn)行異或后,再與密鑰進(jìn)行加密灾茁。
3.CTR計(jì)算器模式:
此模式不常見(jiàn)窜觉,在CTR模式中,有一個(gè)自增的算子北专,這個(gè)算子用密鑰加密之后的輸出和明文異或的結(jié)果得到密文禀挫,相當(dāng)于一次一密。這種方式簡(jiǎn)單快速拓颓,安全可靠语婴,而且可以并行加密,但是在計(jì)算器不能維持很長(zhǎng)的情況下,密鑰只能使用一次砰左。
4.CFB密碼反饋模式:
5.OFB輸出反饋模式:
三匿醒、實(shí)例
1.背景
Android應(yīng)用中通過(guò)對(duì)一個(gè)json數(shù)據(jù)進(jìn)行加密后傳輸給后端進(jìn)行解密驗(yàn)證
2.RSA方式
1.公鑰加密
import android.util.Base64;//導(dǎo)包要用android的,如果用java的缠导,會(huì)有換行導(dǎo)致的轉(zhuǎn)義字符問(wèn)題
public class RSAUtil{
//公鑰
public static String publicKey="跟Java端同樣的公鑰";
/**
* 使用公鑰加密
* @param data 待加密的數(shù)據(jù)
* @return
* @throws Exception
*/
public static String encryptByPublicKey(String data) throws Exception {
// 得到公鑰對(duì)象
KeyFactory keyFactory = KeyFactory.getInstance("RSA");//SA算法
byte[] decodeKey = Base64.decode(publicKey.getBytes(), Base64.DEFAULT);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodeKey);
PublicKey pubKey = keyFactory.generatePublic(keySpec);
// 加密數(shù)據(jù)廉羔,加密方式:1.標(biāo)準(zhǔn)jdk的:RSA/None/PKCS1Padding;2.android的:RSA/None/NoPadding
Cipher cp = Cipher.getInstance("RSA/None/PKCS1Padding");
cp.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encrypted = cp.doFinal(data.getBytes("UTF-8"));
return Base64.encodeToString(encrypted, Base64.DEFAULT);
}
}
public class A{
JSONObject reqbody = new JSONObject();
String encrypt = "";
try {
reqbody.put("name", "XXX");
encrypt = RSAUtil.encrypt(reqbody.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
將encrypt(加密后的json串)作為接口調(diào)用的參數(shù)傳遞到服務(wù)端進(jìn)行解密
2.公鑰分段加密
當(dāng)加密的數(shù)據(jù)過(guò)長(zhǎng)時(shí),解密時(shí)會(huì)出現(xiàn)javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes的異常僻造。因?yàn)镽SA算法規(guī)定一次加密的數(shù)據(jù)不能超過(guò)生成密鑰對(duì)時(shí)的keyLength/8-11憋他,keyLength一般是1024個(gè)字節(jié),則加密的數(shù)據(jù)不能超過(guò)117個(gè)字節(jié)髓削;
https://cloud.tencent.com/developer/article/1730404
3.AES方式
public class AESUtil{
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final String IVPARAMETER = "";//偏移量,可自行修改
private static final String CMCS_KEY = "";//key竹挡,可自行修改
/**
* 加密
* @param data 要加密的數(shù)據(jù)
*/
public static String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
byte[] raw = CMCS_KEY.getBytes("UTF-8");
//獲取密鑰
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(IVPARAMETER.getBytes());// 使用CBC模式,需要一個(gè)向量iv立膛,可增加加密算法的強(qiáng)度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.encodeToString(encrypted, Base64.DEFAULT);
}
}
public class A{
JSONObject reqbody = new JSONObject();
String encrypt = "";
try {
reqbody.put("name", "XXX");
encrypt = AESUtil.encrypt(reqbody.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
將encrypt(加密后的json串)作為接口調(diào)用的參數(shù)傳遞到服務(wù)端進(jìn)行解密
參考:
RSA加密
https://www.cnblogs.com/badaoliumangqizhi/p/14166479.html
AES加密
http://www.reibang.com/p/19b3c7acecb2