非对称加密算法RSA

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA算法晚于DH算法,这五个字母全都是人名首字母.DH算法是第一个非对称密码体系.

RSA算法运算速度慢,不适宜加密大量数据.一种解决方案是,将RSA跟对称加密方式混合使用,将数据使用对称加密方式加密,对称加密的密钥使用RSA算法加密,因为密钥很短,所以时间费不了太多.实际上,对称加密方式唯一的弊端就是密钥不好传递,对称加密方式也很难破解.

RSA的适用情景一:

(1)服务器生成一个公钥和一个私钥,把公钥公开了.

(2)客户端使用公钥把数据进行加密,上交服务器.别人是没法理解加密后的数据的.

(3)服务器使用私钥将数据解密,查看用户提交的数据.

这种情景下,公钥像是一个信箱,每个人都可以往这个信箱里面放信,但是这个信箱里面的信只有掌握信箱钥匙的人才能开箱查看.

RSA适用情景二:

(1)皇上生成一个公钥和一个密钥,把公钥公开了.

(2)皇上发布了一封诏书,昭告天下.诏书右下角有两串数字,第一串数字是一个随机串,第二串数字是用私钥加密第一串数字所得的结果.

(3)有人不相信这诏书是皇上写的,就把第二串数字使用公钥解密,解密之后发现跟第一串数字一样,说明确实是皇上写的,因为一般人没有密钥,也就没法加密那些能够用公钥解密的数据.

这种情境下,公钥用于解密,私钥用于加密,这可以用于发布公告时,证明这个公告确实是某个人发的.相当于签名.

实际上,签名没有必要特别长,一般情况下,签名是定长的,要想定长,可以使用MessageDigest算法,如MD5和SHA系列.所以就有了多种签名算法,如MD5withRSA等.

下面给出java库中RSA的用法,这个程序包括六部分:公钥加密解密,私钥加密解密,私钥签名公钥验证.

public class RSA {
    /**
     * 定义加密方式
     */
    private final static String KEY_RSA = "RSA";
    /**
     * 定义签名算法
     */
    private final static String KEY_RSA_SIGNATURE = "MD5withRSA";
    static PrivateKey toPrivateKey(byte[] b)
            throws NoSuchAlgorithmException, InvalidKeySpecException {
        // 构造PKCS8EncodedKeySpec对象
        PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(b);
        // 指定的加密算法
        KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
        // 取私钥对象
        return factory.generatePrivate(pkcs);
    }
    static PublicKey toPublicKey(byte[] b) throws Exception {
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(b);
        KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
        return factory.generatePublic(keySpec);
    }
    // 用私钥对data签名
    public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {
        Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
        signature.initSign(toPrivateKey(privateKey));
        signature.update(data);
        return signature.sign();
    }
    // 公钥解密数据
    public static boolean verify(byte[] data, byte[] publicKey, byte[] sign)
            throws Exception {
        Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
        signature.initVerify(toPublicKey(publicKey));
        signature.update(data);
        return signature.verify(sign);
    }
    public static byte[] decryptByPrivateKey(byte[] data, byte[] key)
            throws Exception {
        Cipher cipher = Cipher.getInstance(KEY_RSA);
        cipher.init(Cipher.DECRYPT_MODE, toPrivateKey(key));
        return cipher.doFinal(data);
    }
    public static byte[] decryptByPublicKey(byte[] data, byte[] key)
            throws Exception {
        Cipher cipher = Cipher.getInstance(KEY_RSA);
        cipher.init(Cipher.DECRYPT_MODE, toPublicKey(key));
        return cipher.doFinal(data);
    }
    public static byte[] encryptByPublicKey(byte[] data, byte[] key)
            throws Exception {
        Cipher cipher = Cipher.getInstance(KEY_RSA);
        cipher.init(Cipher.ENCRYPT_MODE, toPublicKey(key));
        return cipher.doFinal(data);
    }
    public static byte[] encryptByPrivateKey(byte[] data, byte[] key)
            throws Exception {
        Cipher cipher = Cipher.getInstance(KEY_RSA);
        cipher.init(Cipher.ENCRYPT_MODE, toPrivateKey(key));
        return cipher.doFinal(data);

    }
    static String tos(byte[] b) {
        String ans = "";
        for (int i = 0; i < b.length; i++) {
            ans += String.format("%02X", b[i]);
        }
        return ans;
    }
    public static void main(String[] args) throws Exception {
        KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA);
        // generator.initialize(1024);//默认为1024
        KeyPair keyPair = generator.generateKeyPair();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        System.out.println("公钥:" + tos(publicKey.getEncoded()));
        System.out.println("私钥:" + tos(privateKey.getEncoded()));
        byte[] data = "你好,世界!".getBytes();
        System.out.println("公钥加密-------私钥解密");
        byte[] enc = encryptByPublicKey(data, publicKey.getEncoded());
        byte[] dec = decryptByPrivateKey(enc, privateKey.getEncoded());
        System.out.println("加密前:" + tos(data));
        System.out.println("解密后:" + tos(dec));
        System.out.println("私钥加密--------公钥解密");
        enc = encryptByPrivateKey(data, privateKey.getEncoded());
        dec = decryptByPublicKey(enc, publicKey.getEncoded());
        System.out.println("加密前:" + tos(data));
        System.out.println("解密后:" + tos(dec));
        System.out.println("私钥签名--------公钥验证签名");
        byte[] sign = sign(data, privateKey.getEncoded());
        boolean status = verify(data, publicKey.getEncoded(), sign);
        System.out.println("签名:" + tos(sign));
        System.out.println("状态:" + status);
    }
}
时间: 2024-10-06 10:51:54

非对称加密算法RSA的相关文章

Java加密技术(四)非对称加密算法RSA

RSA  这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman. 这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥.相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了.RSA同时有两把钥匙,公钥与私钥.同时支持数字签名.数字签名的意义在于,对传输过来的数据进行校验.确保数据在传输工程中不被修改. 流程分析: 甲方构建

JAVA 非对称加密算法RSA

非对称加密算法 RSA过程 : 以甲乙双方为例 1.初始化密钥 构建密钥对,生成公钥.私钥保存到keymap中 KeyPairGenerator ---> KeyPair --> RSAPublicKey.RSAPrivateKey 2.甲方使用私钥加密, 加密后在用私钥对加密数据进行数据签名,然后发送给乙方 RSACoder.encryptByPrivateKey(data, privateKey); RSACoder.sign(encodedData, privateKey); 3.乙方则

非对称加密算法RSA使用注意事项

原文:非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteger项目.但这点确实需要注意,如果对大于117字节的数据加密就会抛异常出来,说法还有点莫名其妙.考虑下RSA的主要用途就可以理解了,一般我们使用RSA的主要用途是进行数字签名,另外就是对“对称加密”算法的KEY和IV向量进行加密: 第二个问题,假设要对一个文本文件(比如xml文件)中的某些数据进行加

Java非对称加密算法--RSA加密算法

Java非对称加密算法--RSA加密算法          RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. 1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相

openssl 非对称加密算法RSA命令详解

1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很难推算出私人密钥 根据非对称加密算法的特点,可用户数字签名.密钥交换.数据加密.但是由于非对称加密算法较对称加密算法加密速度慢很多,故最常用的用途是数字签名和密钥交换. 目前常用的非对称加密算法有RSA, DH和DSA三种,但并非都可以用于密钥交换和数字签名.而是RSA可用于数字签名和密钥交换,DH

第十二章 非对称加密算法-RSA

注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与DH不同) 与DH不同的第二点是,RSA自己可以完成加解密,而DH需要依赖于对称加密算法 “私钥加密,公钥解密”或“公钥加密,私钥解密” 公钥长度远小于私钥长度(对下边的代码进行测试,自己比较结果) 加解密流程: 1)发送方(假设为甲方)构建密钥对,自己保留私钥,将公钥发送给接收方(假设为乙方) 2)甲方使用密

信息加密之非对称加密算法RSA

前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单.初始化密钥: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPa

非对称加密算法-RSA算法

??加密算法分为对称加密算法和非对称加密算法,其中非对称加密算法作为计算机通信安全的基石,在保证数据安全方面起着重要的作用.而相对于对称加密算法的易理解性,非对称加密算法存在一定的难度.下面通过对RSA算法的剖析,让我们更好的理解非对称加密算法的原理. 一.对称加密算法和非对称加密算法 1.对称加密算法 ??对称加密算法:加密和解密都使用同样规则(密钥)的算法. ??(1).A选择某一种规则对信息进行加密: ??(2).B使用同一规则(逆规则)对信息进行解密: 2.非对称加密算法 ??非对称加密

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数