网站服务器怎么更换,阿里巴巴国际站怎么网站建设,网站建设备案优化,军事最新消息中国Rsa加解密 概述聚合算法名称#xff08;用于创建加密器#xff09;基本概念填充方式分块加密 基本使用生成密钥加解密创建加密器设置模式#xff08;加密#xff09;、公钥对明文加密#xff0c;并对结果进行Base64编码对以上结果#xff0c;进行解密 设置模式#xff0… Rsa加解密 概述聚合算法名称用于创建加密器基本概念填充方式分块加密 基本使用生成密钥加解密创建加密器设置模式加密、公钥对明文加密并对结果进行Base64编码对以上结果进行解密 设置模式解密、私钥 签名 验签创建签名器初始化签名器加载签名明文生成签名初始化验签参数加载签名明文验签 关于初始化加密器和签名器的重载方法 概述
RSA 是一种非对称加密算法它使用一对密钥公钥和私钥。公钥用于加密数据私钥用于解密数据或者私钥用于签名公钥用于验证签名。
聚合算法名称用于创建加密器
JDK官方文档 常用名称
加密算法名 RSA/ECB/NoPaddingRSA/None/NoPaddingRSA/ECB/PKCS1PaddingRSA/ECB/OAEPWithSHA-1AndMGF1PaddingRSA/ECB/OAEPWithSHA-256AndMGF1Padding 签名算法 SHA1withRSA早期使用现不推荐SHA256withRSA满足日常需要一般情况用得最多SHA384withRSA安全性要求更高计算成本随着变高SHA512withRSA安全性要求极高MD5withRSA目前已不推荐使用MD5被证明存在安全漏洞
基本概念
RSA需要一对密钥对通常需要代码或工具生成。 原始密钥数据是字节数组因此如果需要分发或者存储通常也会进行Base64编码。
填充方式
RSA对明文同样有要求明文块不能大于密钥长度。因此通常情况下也需要进行明文填充如果选择无填充那么明文长度如果不是密钥长度倍数那么可能会报错。
PKCS1Padding 这是最常用的填充方式基本满足日常使用OAEPOAEPWithSHA-1AndMGF1Padding 和 OAEPWithSHA-256AndMGF1Padding OAEP 是一种更安全的填充方式主要用于防止选择明文攻击CPA等高级攻击方式。它基于哈希函数和掩码生成函数来构建填充结构。多用于安全要求较高的场景如金融等场景。虽然安全性更高但是计算成本也更高。NoPadding 不进行填充此时对明文有要求长度须是密钥整数倍。
分块加密
RSA算法要求单次加密明文长度不能超出密钥长度如果明文可能超出密钥长度要么使用ECB分块模式加密要么手动分块后逐个块加密。 分块模式ECB按密钥长度分块、NONE不分块
基本使用
生成密钥
支持密钥长度512及以下早期使用现在少用、1024用得较多、2048目前使用最多、3072 位和 4096 位对安全要求极高的场景但会增加计算成本
生成密钥对象
KeyPairGenerator pairGenerator KeyPairGenerator.getInstance(RSA);
pairGenerator.initialize(2048);
KeyPair keyPair pairGenerator.genKeyPair();解析出公私钥可以从密钥对象中获取公私钥
// 私钥
PrivateKey privateKey keyPair.getPrivate();
// 公钥
PublicKey publicKey keyPair.getPublic();此时的公私钥是以字节数组存在如果要进行存储和分发。通常使用Base64编码
// 私钥字符串
String privateEncode Base64.getEncoder().encodeToString(privateKey.getEncoded());// 公钥字符串
String publicEncode Base64.getEncoder().encodeToString(publicKey.getEncoded())加解密
创建加密器
Cipher cipher Cipher.getInstance(RSA/ECB/PKCS1Padding);设置模式加密、公钥
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());对明文加密并对结果进行Base64编码
byte[] bytes cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));System.out.println(加密后的内容 Base64.getEncoder().encodeToString(bytes));对以上结果进行解密 设置模式解密、私钥
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] bytes1 cipher.doFinal(bytes);
System.out.println(解密后的内容 new String(bytes1));签名 验签
我们通常说的RSA签名实际上是一种简略的说法。 RSA签名实际是签名 加密 2个过程。 其中散列算法或者叫摘要算法签名算法等等常用的有
SHA256大部分场景使用平衡安全和性能SHA384SHA512MD5MD5被证明存在漏洞不推荐使用SHA1早期使用目前已不推荐使用
这些散列算法是独立于RSA的RSA签名算法名称就是在它们后面增加 withRSA 而已。
所谓RSA签名只是对散列算法得到的散列值进行RSA加密而已。这一点要明确。 接着上面创建RSA密钥后开始进行签名与验签
创建签名器
与加解密不同签名器由Signature这个类提供支持
Signature signature Signature.getInstance(SHA256withRSA);初始化签名器加载签名明文
signature.initSign(keyPair.getPrivate());
signature.update(str.getBytes(StandardCharsets.UTF_8));生成签名
byte[] byteSign signature.sign();
System.out.println(签名 Base64.getEncoder().encodeToString(byteSign));初始化验签参数加载签名明文
signature.initVerify(keyPair.getPublic());
signature.update(str.getBytes(StandardCharsets.UTF_8));验签
boolean verify signature.verify(byteSign);
System.out.println(验签结果 verify);关于初始化加密器和签名器的重载方法
在RSA加密场景除了模式公钥外还有个参数SecureRandom random它用于在一些填充模式OAEP下生成一个随机掩码提高加密安全性。