非对称加密算法——RSA


什么是非对称加密算法

加密和解密使用的是不相同的密钥,用户A密钥加密后所得的信息,只能用用户A的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;;不公开的密钥为私钥。只有同一个公钥-私钥对才能正常加解密。


对称式和非对称式加密的区别

对称加密时加密和解密使用相同密钥的加密算法,在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为单密钥算法。

对称式和非对称式加密的特点

  • 对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,安全性得不到保证
  • 非对称加密的缺点:安全性得到了保证,但运算速度非常慢,比对称加密要慢很多

案例实现

用公钥进行加密,私钥解密,因此,除了私钥持有人之外,没有人能解开加密结果

// RSA
public class Work04 {
	public static void main(String[] args) throws Exception {
		// 明文:
		byte[] plain = "Hello, encrypt use RSA".getBytes("UTF-8");
		// 创建公钥/私钥对
		Human hong = new Human("小红");
		Human ming = new Human("小明");	
		// 小明使用小红的公钥进行加密
		// 1.获取小红的公钥
		PublicKey hongPublicKey = hong.getPublicKey();
		System.out.println(String.format("小红的public key(公钥): %x", new BigInteger(1, hongPublicKey.getEncoded())));

		// 2.使用公钥加密
		byte[] encrypted = ming.encrypt(plain,hongPublicKey);
		System.out.println(String.format("encrypted(加密): %x", new BigInteger(1, encrypted)));

		// 小红使用自己的私钥解密:
		// 1.获取小红的私钥,并输出
		PrivateKey hongPrivateKey = hong.getPrivateKey();
		System.out.println(String.format("小红的private key(私钥): %x", new BigInteger(1, hongPrivateKey.getEncoded())));

		// 2.使用私钥解密
		byte[] decrypted = hong.decrypt(encrypted);
		System.out.println("decrypted(解密): " + new String(decrypted, "UTF-8"));
	}
}
// 用户类
class Human {
	// 姓名
	String name;
	// 私钥:
	PrivateKey privatekey;
	// 公钥:
	PublicKey publickey;
	// 构造方法
	public Human(String name) throws GeneralSecurityException {
		// 初始化姓名
		this.name = name;
		// 生成公钥/私钥对:
		KeyPairGenerator kyGen = KeyPairGenerator.getInstance("RSA");
		kyGen.initialize(1024);
		KeyPair kp =kyGen.generateKeyPair();		
		this.publickey=kp.getPublic();
		this.privatekey=kp.getPrivate();
	}
	// 把私钥导出为字节
	public PrivateKey getPrivateKey() {
		return this.privatekey;
	}
	// 把公钥导出为字节
	public PublicKey getPublicKey() {
		return this.publickey;
	}
	// 用公钥加密
	public byte[] encrypt(byte[] message,PublicKey publickey) throws GeneralSecurityException {
		// 使用公钥进行初始化
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, publickey);
		return cipher.doFinal(message);
	}
	// 用私钥解密:
	public byte[] decrypt(byte[] input) throws GeneralSecurityException {
		// 使用私钥进行初始化
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, this.privatekey);
		return cipher.doFinal(input);
	}
}

RSA算法可以根据不同的密钥(公钥+私钥)实现数据的加密和解密。

在这里插入图片描述


总结

  • 非对称加密就是加密和解密使用的不是相同的密钥,只有同一个公钥-私钥对才能正常加密和解密。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值