参考:数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)
【前言】常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法
一、非对称加密算法
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密,反之亦然。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方、丙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。这样其他任何人想法送给此用户信息,只需查询词公钥,加密发送即可,而此用户用只有自己知道的秘钥解密,它消除了最终用户交换密钥的需要。
1、基于RSA算法的实现
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
到这里,公钥和密钥已经确定。公钥为(n, e) = (33, 3),密钥为(n, d) = (33, 7)。
(3)代码:
public class SimpleRSA { /** * 加密、解密算法 * @param key 公钥或密钥 * @param message 数据 * @return */ public static long rsa(int baseNum, int key, long message){ if(baseNum < 1 || key < 1){ return 0L; } //加密或者解密之后的数据 long rsaMessage = 0L; //加密核心算法 rsaMessage = Math.round(Math.pow(message, key)) % baseNum; return rsaMessage; } public static void main(String[] args){ //基数 int baseNum = 3 * 11; //公钥 int keyE = 3; //密钥 int keyD = 7; //未加密的数据 long msg = 24L; //加密后的数据 long encodeMsg = rsa(baseNum, keyE, msg); //解密后的数据 long decodeMsg = rsa(baseNum, keyD, encodeMsg); System.out.println("加密前:" + msg); System.out.println("加密后:" + encodeMsg); System.out.println("解密后:" + decodeMsg); } }
(4)但是,仅仅这些还不够。假如有A用户用B的公钥向B用户发送了信息“A love you”,B接收到之后怎么确定就是A发送的呢(因为中间人攻击中,假如C截获了A发送的信息后,并且获取了B的私钥,改成“C love you”,B是无法确定这两个信息的发送者,因她们都同样用B的工要加密),于是产生了签名证书技术。
B. Alice 对数字信息进行哈希(hash)运算,得到一个信息摘要。
F. Bob 用Alice 的公钥(PK)对Alice 的数字签名进行解密,得到信息摘要。