1. RSA信息加密
RSA加密步骤 - 例子
1. 计算钥匙阶段 - N的二进制位数即是密钥的长度
一般用的密钥长度是1024位密钥,重要的信息需要2048位密钥
-
随便找两个质数:7 与 11
-
计算两个质数的模数:N = 7 * 11 = 77
-
计算欧拉函数: 6 * 10 = 60
-
得出钥匙(钥匙,N)
- 公钥:1 < 公钥 < 60 并且 公钥与欧拉函数值的公因数只能为1 – 我选择 17作为公钥
一般写成 公钥(17,77)
- 私钥:公钥 * 私钥 % 欧拉函数=1 – 计算得 53作为私钥
一般写成 私钥(53,77)
下列是根据公钥、欧拉函数计算私钥简单Java代码
public static void main(String[] args) {
int m = 0;
int pubicKey= 17;
int oula = 60;
while(true) {
int num = oula * (++m) + 1;
if(num % pubicKey == 0) {
System.out.println("私钥:" + num/17);
break;
}
}
}
2. 加密、解密阶段
假设明文为 2
-
公钥加密:明文的公钥次方 模 两个质数积N – 2 ^ 17 % 77 = 18 – 即密文为18
-
私钥解密:密文的私钥次方 模 两个质数积N – 18 ^ 53 % 77 = 2 – 即明文为2
注意:按照我的数字实验私钥解密的话,必须使用 BigInteger进行计算,因为数字太大了Integer已经超出范围了
public static void main(String[] args) {
BigInteger sum = new BigInteger("1");
BigInteger num = new BigInteger("18");
for(int i = 0; i < 53; i++) {
sum = sum.multiply(num);
}
BigInteger mingWen = sum.mod(new BigInteger("77"));
System.out.println(mingWen);
}
2. RSA签名
- 发送者:使用发送者自己私钥将明文进行加密成签名信息,签名信息伴随明文一起发送
- 接收者:使用发送者的公钥将签名信息进行解密,解密后的信息跟明文进行比较是否一致,如果一致则表明信息没有被修改。
具体流程
3. 数字证书 - 权威机构证明传过来的公钥是对方的
为什么会出现数字证书 - 因为用户与用户之间受到中间人的攻击
- 小A与小B在网络中使用RSA加密进行交流
- 小A发送给小B的信息必定使用小B的公钥进行加密
- 同理,小B发送给小A的信息必定使用小A的公钥进行加密
- 但是中间人冒充小B,小A,将中间人自己的公钥发送给小A、小B,则小A、小B发送的信息都可以被中间人用自己的私钥可以看见,或者修改信息。
为证明传过来的公钥是对方 - 则出现CA(证书颁布机构)- 为公钥颁布身份证的作用
-
用户A、用户B去CA认证机构进行登记身份证 - 用来为自己公钥确定身份
-
CA机构各生成一对只属于他们的公钥私钥
-
注意:CA自身自己会有一把公钥C、私钥D
-
例如小A的证书 - 明文内容是A的公钥、过期时间、以及其他的信息,经过不可逆的算法进行加密如 MD5、SHA-1、SHA-256等,在使用私钥D进行加密形成该证书的签名。证书上的明文内容 + 签名密文 就是证书的内容
-
到时小B发送消息给小A的时候,小A首先发送自己的证书给小B即可, 同理
-
小B 收到 小A 的证书,则查看证书上CA机构是否合法,不是谁都可以充当“公安局”的,如果不是信任的CA机构 - 浏览器会自动弹出提示
-
如果确定证书机构是受信任的。则使用CA的公钥解密签名 - 得到一段不可逆的密文1
-
证书上会写明使用什么算法进行加密签名,则使用证书上的算法进行加密证书上的明文内容,得到密文2
-
如果密文1 与 密文2 相同 则说明证书没有被修改,则证书上的公钥可以使用,否则不可使用,证书内容被中间人修改过。