加密举例
比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:
- Bob将他的公开密钥传送给Alice。
- Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
- Bob用他的私人密钥解密Alice的消息。
上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。
例子和图出自《网络安全基础 应用与标准第二版》
RSA算法
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
编码实现
package encrypt;
import org.apache.tomcat.util.codec.binary.Base64;
import javax.crypto.Cipher;
import java.io.*;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
/**
* RSA加解密及签名校验
* RSA签名算法:MD2withRSA、MD5withRSA、SHA1withRSA,为jdk实现
* 1.秘钥长度为64的倍数,在512~65536之间,默认长度1024,签名长度和秘钥长度相同
* 签名算法:SHA256withRSA,为BC实现,秘钥默认长度为2048
*/
public class RsaSecurity {
//非对称加密算法
public static final String KEY_ALGORITHM = "RSA";
//签名算法
public static final String SIGN_ALGORITHM = "SHA256withRSA";
/**
* 秘钥长度,必须是64的倍数,在512~65536之间
*/
private static final int KEY_SIZE = 512;
//公钥
private static final String PUBLIC_KEY =