非对称加密,即加密秘钥与解密秘钥不一样的加密算法。一般用公钥加密,私钥解密。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e1*e2)mod ((p-1)*(q-1))=1。
这样就得到了公钥pk:(n,e1);私钥sk:(n,e2)。
基本思想
RSA是一种非对称加密算法,名字是三位发明人的名字首字母,没什么其他含义。
RSA的基本思想是大素数的乘积很难被因式分解,它涉及三个参数,n,e1,e2。
其中,n是两个大质数p、q的积,n的二进制表示的位数,就是密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e1*e2)mod ((p-1)*(q-1))=1。
这样就得到了公钥pk:(n,e1);私钥sk:(n,e2)。
加密
设A为明文(plaintext),B为密文(ciphertext),则B=A^e1 mod n.解密
A=B^e2 mod n.
java库函数实现:
package com.likeyichu;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Arrays;
import javax.crypto.Cipher;
public class Snippet {
public static void main(String[] args) throws Exception {
// 生成公钥和私钥
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(512);// at least 512
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey pk = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey sk = (RSAPrivateKey) keyPair.getPrivate();
System.out.println(pk.toString()+"\n"+sk.toString());
// 明文
String plaintext = "12345上山打老虎";
System.out.println("加密前的明文\t" + plaintext);
// 加密后的密文
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] cipherArr=cipher.doFinal(plaintext.getBytes());
String ciphertext=Arrays.toString(cipherArr);
System.out.println("加密后的密文\t" + ciphertext);
// 解密后的明文
cipher.init(Cipher.DECRYPT_MODE, sk);
plaintext =new String(cipher.doFinal(cipherArr));
System.out.println("解密后的明文\t" + plaintext);
// BigInteger b=new BigInteger("286505723666896292776470016251827818171881994971643061094775617917918825912608529306814082245946039911031381920317412828512978914976273266189820626643608289");
// System.out.println(b.bitLength());
}
}
//公钥每次都不一样
/*
Sun RSA public key, 512 bits
modulus: 10148603903683215456016294375623545546974519036746460792261375470013136045561873937055955475818361947091770538487416140726643219702815227104765775393094467
public exponent: 65537
sun.security.rsa.RSAPrivateCrtKeyImpl@fffa32c5
加密前的明文 12345上山打老虎
加密后的密文 [53, 81, -50, 43, 61, -112, -97, -19, -109, 3, 20, -43, -39, 52, -59, -28, 10, -27, 17, -99, 17, -94, -1, -57, 10, -50, -18, 31, 5, 41, -8, -3, -55, -37, -110, -83, -43, 28, -111, -23, 37, -62, 102, -94, 49, 34, 15, -2, 13, -23, 104, -1, -28, 93, 106, -106, -123, 55, 33, -40, -89, 9, 10, -2]
解密后的明文 12345上山打老虎
*/