Rsa加密算法

简介

Rsa是一种非对称加密算法,含有公钥和私钥。既可以使用公钥加密然后私钥解密,也可以使用私钥加密然后公钥解密,但后者的效率比前者慢100~1000倍。

特点:
1. 便于理解,使用广泛。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

2. 缺点与不足:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

应用场景
RSA用于保密性时,就是公钥加密,私钥解密。 因为公钥是可以公开了, 那么任何人都可以使用公钥对信息进行加密,但是只有持有私钥的人才能正确解密。这样就保证了信息的保密性,因为只有私钥持有者才能正确解密。

RSA用于认证性时,比如数字签名,即私钥持有者对信息进行签名,验证者可以根据公开的公钥进行验证签名是否正确和有效,即实现了认证性,以及不可抵赖性。

DES/AES加密速度快,适合大量数据,处理数据后可复原。

MD5用于完整性,确保信息在传输过程保持一致性;用于密码加密,数据库中不存储密码明文,而是存储其散列值,校验时比较散列值是否相同

组合使用
采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,使用散列函数进行数据摘要。

代码:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;

@Slf4j
public class RsaUtils {
    public final static String CHARSET_ENCODING = "UTF-8";

    /**
     * 编码
     *
     * @param password  密码的明文
     * @param publicKey 公钥
     * @return 返回加密后的密码(用于登陆)
     */
    public static String encrypt(String password, String publicKey) {
        try {
            byte[] decode = Base64.decodeBase64(publicKey);
            RSAPublicKey pk = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pk);
            return Base64.encodeBase64String(cipher.doFinal(password.getBytes(CHARSET_ENCODING)));
        } catch (Exception e) {
            log.error("加密失败", e);
        }
        return "";
    }

    public static void main(String[] args) {
        //注意:这里是公钥的内容,去除了头(-----BEGIN PUBLIC KEY-----)和尾(-----END PUBLIC KEY-----)
        String publicKey = "MIGfMXXXXXX....";
        String password = "123456";
        String encrypt = encrypt(password, publicKey);
        System.out.println(encrypt);
    }
}

说明:网上大部分RSA算法加密都是直接读文件流,然后处理的;直接通过密钥内容处理的情况比较少,所以进行记录。

仅测试验证的话,网上有线上加解密网站供使用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值