RSA非对称加密

非对称加密,即加密秘钥与解密秘钥不一样的加密算法。一般用公钥加密,私钥解密。

基本思想

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上山打老虎
*/

你可能感兴趣的:(其他)