“RAS算法”这个术语本身并不常见或标准,它可能指向两个主要领域的不同概念,具体取决于上下文:
- 更可能是拼写错误:指 RSA 算法(密码学)
- 这是最常见的情况。 “RAS” 极有可能是 “RSA” 的拼写错误。
- RSA 算法 是现代密码学中最重要和最广泛使用的公钥加密算法之一。它由 Ron Rivest, Adi Shamir 和 Leonard Adleman 于 1977 年提出,因此得名。
- 核心概念:
- 非对称加密: 使用一对密钥:公钥和私钥。
- 公钥: 可以公开给任何人,用于加密消息或验证数字签名。
- 私钥: 必须严格保密,用于解密用对应公钥加密的消息或创建数字签名。
- 工作原理基础:
- 密钥生成:
- 选择两个非常大的、不同的质数
p
和q
。 - 计算模数
n = p * q
。 - 计算欧拉函数
φ(n) = (p-1) * (q-1)
。 - 选择一个整数
e
(公钥指数),满足1 < e < φ(n)
且e
与φ(n)
互质(即gcd(e, φ(n)) = 1
)。 - 计算整数
d
(私钥指数),满足(d * e) ≡ 1 mod φ(n)
。即d
是e
关于模φ(n)
的模反元素。
- 公钥:
(e, n)
- 私钥:
(d, n)
- 选择两个非常大的、不同的质数
- 加密 (使用公钥): 对于明文消息
M
(转换为小于n
的整数),计算密文C = M^e mod n
。 - 解密 (使用私钥): 对于密文
C
,计算明文M = C^d mod n
。
- 密钥生成:
- 安全性基础: RSA 的安全性依赖于大整数分解难题。从公开的
n
推导出私钥d
需要分解n
得到p
和q
。当p
和q
是足够大(例如 2048 位或更长)的质数时,分解n
在计算上是不可行的(至少在经典计算机上是这样)。 - 应用:
- 安全数据传输(如 HTTPS/SSL/TLS)
- 数字签名(验证文件来源和完整性)
- 软件保护
- 安全电子邮件 (PGP, S/MIME)
- 区块链和加密货币
source接口
/**
* @ClassName RAS加密算法 Source
* 待适配
* @Author ykx
* @Date 2024/5/8 8:44
* @Version 1.0
*/
@Data
public class RASUtil {/*** 公钥*/public static PublicKey publicKey;/*** 私钥*/public static PrivateKey privateKey;/*** 加密器*/public static Cipher cipher;public static final String RSA = "RSA";/*** 获取公钥和私钥*/static {// 1.获取公钥私钥KeyPairGenerator keyPairGen = null;// 获取RSA算法实例try {// // 获取RSA算法实例keyPairGen = KeyPairGenerator.getInstance(RSA);// 1024代表密钥二进制位数keyPairGen.initialize(1024);// 产生KeyPair工厂KeyPair keyPair = keyPairGen.generateKeyPair();publicKey = keyPair.getPublic();privateKey = keyPair.getPrivate();cipher = Cipher.getInstance(RSA);} catch (Exception e) {e.printStackTrace();}}/*** 私钥加密** @return 加密后的数据*/public byte[] privateEncode(String content) throws Exception {cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(content.getBytes());}/*** 公钥解密** @return 解密后的数据*/public String publicDecode(byte[] encodeContent) throws Exception {cipher.init(Cipher.DECRYPT_MODE, publicKey);byte[] decodeContent = cipher.doFinal(encodeContent);return new String(decodeContent);}}
目标接口:TargetAble
public interface TargetAble {/*** 私钥加密** @return 加密后的数据*/byte[] privateEncode(String content) throws Exception;/*** 公钥解密** @return 解密后的数据*/String publicDecode(byte[] encodeContent) throws Exception;/*** 公钥加密** @return 加密后的数据*/byte[] publicEncode(String content) throws Exception;/*** 私钥解密** @return 解密后的数据*/String privateDecode(byte[] encodeContent) throws Exception;/*** 加签** @param bytes 加签数据* @return 签名后的结果*/String sign(byte[] bytes) throws Exception;/*** 验签** @param bytes* @return* @throws Exception*/Boolean verify(byte[] bytes, String sign) throws Exception;}
适配器:
@EqualsAndHashCode(callSuper = false)
@Data
public class Adapter extends RASUtil implements TargetAble {/*** 加签*/public static Signature signature;public final static String SIGNATURE_ALGORITHM = "MD5withRSA";static {try {// 获取签名算法signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(privateKey);} catch (Exception e) {e.printStackTrace();}}/*** 公钥加密** @param content* @return 加密后的数据*/@Overridepublic byte[] publicEncode(String content) throws Exception {RASUtil.cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(content.getBytes());}/*** 私钥解密** @param encodeContent* @return 解密后的数据*/@Overridepublic String privateDecode(byte[] encodeContent) throws Exception {cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decodeContent = cipher.doFinal(encodeContent);return new String(decodeContent);}/*** 加签** @param bytes 加签数据* @return 签名后的结果*/@Overridepublic String sign(byte[] bytes) throws Exception {signature.update(bytes);return Base64.getEncoder().encodeToString(signature.sign());}/*** 验签** @param bytes* @return* @throws Exception*/@Overridepublic Boolean verify(byte[] bytes, String sign) throws Exception {signature.initVerify(publicKey);signature.update(bytes);return signature.verify(Base64.getDecoder().decode(sign));}
}
测试类:
public class Main {// Adapter RASUtil TargetAble 三个类组合的适配器为类的适配器模式public static void main(String[] args) throws Exception {TargetAble targetAble = new Adapter();String content = "学习算法,有益身心健康!!";// 公钥加密,私钥解密byte[] publicEncode = targetAble.publicEncode(content);System.out.println("公钥加密:" + Base64.getEncoder().encodeToString(publicEncode));System.out.println("私钥解密:" + targetAble.privateDecode(publicEncode));// 私钥加密,公钥解密byte[] privateEncode = targetAble.privateEncode(content);System.out.println("私钥加密:" + Base64.getEncoder().encodeToString(privateEncode));System.out.println("公钥解密:" + targetAble.publicDecode(privateEncode));// 加签String sign = targetAble.sign(content.getBytes());System.out.println("加签后:" + sign);// 验签Boolean verify = targetAble.verify(content.getBytes(), sign);System.out.println("验签结果:" + verify);}
}