安全加密算法与数据签名总结(3)

本文总结了非对称加密算法在机密信息交换中的应用,阐述了如何使用公钥和私钥进行加密和解密,确保数据安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非对称加密
     非对称加密算法又称为公开密钥加密算法,它需要两个密钥,一个称为公开密钥,即公钥;另一个称为私有密钥,即私钥。公钥和私钥需要配对使用,如果用公钥对数据进行加密,只有用对应的私钥才能进行解密,而如果使用私钥对数据进行加密,那么只有用对应的公钥才能进行解密。因为加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。

     非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公钥向其他人公开,得到该公钥的乙方使用密钥对机密信息进行加密后再发送给甲方,甲方再使用自己保存的另一把专用密钥(即私钥)对加密后的信息进行解密。 



非对称加密算法的特点:对称加密算法中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥,所以保证其安全性就是保证密钥的安全,而一旦密钥在传输过程中泄漏,加密信息就不再安全。而非对称加密算法中包含有两种密钥,其中一个是公开的,这样就不需要像对称加密算法那样,需要传输密钥给对方进行数据加密了,大大地提高了加密算法的安全性。非对称加密算法能够保证,即使实在获知公钥、加密算法和加密算法源代码的情况下,也无法获得公钥对应的私钥,因此也无法对公钥加密的密文进行解密。
     但是由于非对称加密算法的复杂性,使得其加密解密速度远没有对称加密解密的速度快。为了解决加密的速度问题,人们一般采取两种加密结合使用的办法,优缺点互补,达到时间和安全的平衡:对称加密算法加密速度快,人们用它来加密较长的文件,然后用非对称加密算法来给文件密钥加密,解决了对称加密算法的密钥分发问题。
     当前使用最为广泛的非对称加密算法非RSA莫属。背包算法

1、RSA算法
     RSA非对称加密算法是目前最有影响力的非对称加密算法,他能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但反过来想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
     Java的RSA算法的基本使用:
     生成公钥与私钥:
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA);
    keyPairGen.initialize(1024);//密码位数
公钥和私钥可以通过KeyPairGenerator执行generateKeyPair()后生成密钥对KeyPair,通过KeyPair.getPublic()和KeyPair.getPrivate()来获取。如下代码:
// 动态生成密钥对,这是当前最耗时的操作,一般要2s以上。
KeyPair keyPair = keyPairGen.generateKeyPair();// 公钥
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();// 私钥
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
byte[] publicKeyData = publicKey.getEncoded();
byte[] privateKeyData = publicKey.getEncoded();

     // 通过公钥byte[]将公钥还原,适用于RSA算法
     public static PublicKey getPublicKey( byte[] keyBytes) throws NoSuchAlgorithmException,InvalidKeySpecException {
      X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
      PublicKey publicKey = keyFactory.generatePublic(keySpec);
     return publicKey;
          
     // 通过私钥byte[]将公钥还原,适用于RSA算法
     public static PrivateKey getPrivateKey( byte[] keyBytes) throws NoSuchAlgorithmException, InvalidKeySpecException {
              PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
              KeyFactory keyFactory = KeyFactory.getInstance("RSA");
              PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
              return privateKey;

     使用1024初始化KeyPairGenerator,RSA加密后的密文的长度为1024位,即128个字节,此时明文的最大长度不能超过117个字节,超过117个字节需要使用2048的keysize来初始化KeyPairGenerator,超过245个字节则需要使用更高位数的keysize。RSA的keysize位数越高,其产生密钥对及加密、解密的速度越慢,这是基于大素数非对称加密算法的缺陷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值