RSA encryption principle
step | Explanation | description | Remark |
---|---|---|---|
1 | To find a prime number | P and Q | - |
2 | Calculating public modulus | N = P * Q | - |
3 | Euler function | φ(N) = (P-1)(Q-1) | - |
4 | Calculate a public key E | 1 < E < φ(N) | E value of E must be an integer and φ (N) must be co-prime |
5 | Compute the private key D | E * D% φ (N) = 1 | - |
6 | encryption | C = M E mod N | C: ciphertext M: plain |
7 | Decryption | M =C D mod N | C: ciphertext M: plain |
Public Key = (E, N)
private key = (D, N)
Externally, we only expose the public key.
Examples
1, to find a prime number P, Q
P = 3
Q = 11
2, the public modulus calculated
N = P * Q = 3 * 11 = 33
N = 33
3, Euler function
φ(N) = (P-1)(Q-1) = 2 * 10 = 20
φ(N) = 20
4, calculates the public key E
1 < E < φ(N)
1 <E < 20
In the range of E. 3 {,. 7,. 9,. 11, 13 is,. 17,. 19}
E values must be an integer, E and φ (N) must be co-prime
For testing, we take a minimum value. 3 = E
. 3 and φ (N) = 20 relatively prime, the condition
5, the private key D is calculated
E * D % φ(N) = 1
3 * D % 20 = 1
According to the above calculated D = 7
6, public key encryption
We are here to demonstrate, to encrypt a relatively small number M = 2
Official: C = ME mod N
M = 2
E = 3
N = 33
C = 23 % 33 = 8
Clear "2" after the RSA encryption into ciphertext "8"
7, the private key to decrypt
M =CD mod N
C = 8
D = 7
N = 33
M = 87 % 33
8 * 8 * 8 * 8 * 8 * 8 * 8=2097152
8 * 8 * 8 * 8 * 8 * 8 * 8 % 33 = 2
Ciphertext "8" After RSA decryption plaintext into 2.
JDK comes with the RSA algorithm
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
/**
* 非对称加密 唯一广泛接受并实现 数据加密&数字签名 公钥加密、私钥解密 私钥加密、公钥解密
*
* @author jjs
*
*/
public class RSADemo {
private static String src = "infcn";
private static RSAPublicKey rsaPublicKey;
private static RSAPrivateKey rsaPrivateKey;
static {
// 1、初始化密钥
KeyPairGenerator keyPairGenerator;
try {
keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);// 64的整倍数
KeyPair keyPair = keyPairGenerator.generateKeyPair();
rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded()));
System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* 公钥加密,私钥解密
* @author jijs
*/
public static void pubEn2PriDe() {
//公钥加密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("公钥加密,私钥解密 --加密: " + Base64.encodeBase64String(result));
//私钥解密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
result = cipher.doFinal(result);
System.out.println("公钥加密,私钥解密 --解密: " + new String(result));
}
/**
* 私钥加密,公钥解密
* @author jijs
*/
public static void priEn2PubDe() {
//私钥加密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("私钥加密,公钥解密 --加密 : " + Base64.encodeBase64String(result));
//公钥解密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
result = cipher.doFinal(result);
System.out.println("私钥加密,公钥解密 --解密: " + new String(result));
}
public static void main(String[] args) {
pubEn2PriDe(); //公钥加密,私钥解密
priEn2PubDe(); //私钥加密,公钥解密
}
}
Personal blog
Tencent cloud community
Nuggets
Jane book
Public number: