文档章节

公钥私钥RSA加密

o
 osc_fmg49rzg
发布于 2019/03/20 11:08
字数 934
阅读 14
收藏 0

精选30+云产品,助力企业轻松上云!>>>

公钥私钥RSA加密

、摘要

公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。通过这种算法得到的密钥对能保证在世界范围内是独一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

二、背景

网络间双方通信需要有一种加密方式,RSA公钥加密是目前被推荐的加密标准。

三、推广建议

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

 

四、正文

举例:

比如有两个用户AliceBobAlice想把一段明文通过双钥加密的技术发送给BobBob有一对公钥和私钥,那么加密解密的过程如下:

Bob将他的公开密钥传送给Alice

AliceBob的公开密钥加密她的消息,然后传送给Bob

Bob用他的私人密钥解密Alice的消息。

  上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

 

例子和图出自《网络安全基础 应用与标准第二版》

总结:公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。

 

/**
 * 使用RSA私钥加密数据
 *
 * @param  pubKeyInByte
 *            打包的byte[]形式私钥
 * @param data
 *            要加密的数据
 * @return 加密数据
 */
public static byte[] encryptByRSA1(byte[] privKeyInByte, byte[] data) {
    try {
        PKCS8EncodedKeySpec priv_spec = new PKCS8EncodedKeySpec(
                privKeyInByte);
        KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privKey = mykeyFactory.generatePrivate(priv_spec);
        Cipher cipher = Cipher.getInstance(mykeyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, privKey);
        return cipher.doFinal(data);
    } catch (Exception e) {
        return null;
    }

}

/**
 * 用RSA公钥解密
 *
 * @param privKeyInByte
 *            公钥打包成byte[]形式
 * @param data
 *            要解密的数据
 * @return 解密数据
 */
public static byte[] decryptByRSA1(byte[] pubKeyInByte, byte[] data) {
    try {
        KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec pub_spec = new X509EncodedKeySpec(pubKeyInByte);
        PublicKey pubKey = mykeyFactory.generatePublic(pub_spec);
        Cipher cipher = Cipher.getInstance(mykeyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, pubKey);
        return cipher.doFinal(data);
    } catch (Exception e) {
        return null;
    }
}

 

/**
 * 公钥加密
 * @param data 待加密数据
 * @param key 密钥
 * @return byte[] 加密数据
 * */
public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{

    //实例化密钥工厂
    KeyFactory keyFactory=KeyFactory.getInstance("RSA");
    //初始化公钥
    //密钥材料转换
    X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);
    //产生公钥
    PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);

    //数据加密
    Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    return cipher.doFinal(data);
}
/**
 * 私钥解密
 * @param data 待解密数据
 * @param key 密钥
 * @return byte[] 解密数据
 * */
public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{
    //取得私钥
    PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);
    KeyFactory keyFactory=KeyFactory.getInstance("RSA");
    //生成私钥
    PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
    //数据解密
    Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    return cipher.doFinal(data);
}

 

//Java生成公钥私钥

//实例化密钥生成器
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
//初始化密钥生成器

/**
 * 密钥长度,DH算法的默认密钥长度是1024
 * 密钥长度必须是64的倍数,在512到65536位之间
 * */


keyPairGenerator.initialize(1024);
//生成密钥对
KeyPair keyPair=keyPairGenerator.generateKeyPair();
//甲方公钥
RSAPublicKey publicKey=(RSAPublicKey) keyPair.getPublic();
System.out.println("系数:"+publicKey.getModulus()+"  加密指数:"+publicKey.getPublicExponent());
//甲方私钥
RSAPrivateKey privateKey=(RSAPrivateKey) keyPair.getPrivate();
System.out.println("系数:"+privateKey.getModulus()+"解密指数:"+privateKey.getPrivateExponent());

System.out.println("公钥:"+ Base64.encodeBase64String(publicKey));
System.out.println("私钥:"+Base64.encodeBase64String(privateKey));

  

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
RSA 加密及php实现

RSA加密简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新手对它不太了解。下面仅作简要介绍。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能...

月小升
04/12
10
0
浅谈RSA加密算法

一、什么是非对称加密 1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2、密钥分为:公钥,私钥   公钥:可以对外给任何人的加密和解密的密码,是公开的 私钥:通过私钥...

听着music睡
2015/10/18
0
0
非对称加密算法-RSA算法

一、概述 1、RSA是基于大数因子分解难题。目前各种主流计算机语言都支持RSA算法的实现 2、java6支持RSA算法 3、RSA算法可以用于数据加密和数字签名 4、RSA算法相对于DES/AES等对称加密算法,...

王爵nice
2015/03/31
70
0
RSA公钥,私钥和数字签名简单理解

一、公钥加密 假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。 我有一个文件,不能让别人看,我就用1加密了。...

蛋黄哥
2018/05/29
86
0
RSA 加密及php实现

RSA加密简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新手对它不太了解。下面仅作简要介绍。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能...

yuexiaosheng
04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈对python pandas中 inplace 参数的理解

这篇文章主要介绍了对python pandas中 inplace 参数的理解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否...

Linux就该这么学
24分钟前
13
0
C++ 从基本数据类型说起

前言 int 在32位和64位操作系统,都是四个字节长度。为了能编写一个在32位和64位操作系统都能稳定运行的程序,建议采用std::int32_t 或者std::int64_t指定数据类型。*与long随操作系统子长变...

osc_sxdofc9c
24分钟前
9
0
游戏音乐的作用以及起源

游戏音乐是由特殊的音乐、语言符号、美学符号组成,在电子游戏的发展下,游戏音乐越来越成熟,游戏音乐与美术相融合,能够带给玩家视觉与声音的感官冲击,形成游戏音乐所具有的独特的审美效果...

奇亿音乐
24分钟前
10
0
2020,最新Model的设计-APP重构之路

很多的app使用MVC设计模式来将“用户交互”与“数据和逻辑”分开,而model其中一个重要作用就是持久化。下文中设计的Model可能不是一个完美的,扩展性强的model范例,但在我需要重构的app中,...

osc_mfzkzkxi
25分钟前
4
0
面对职业瓶颈,iOS 开发人员应该如何突破?

我们经常看到 iOS 开发人员(各种能力水平都有)的一些问题,咨询有关专业和财务发展方面的建议。 这些问题有一个共同点:前面都会说“我现在遇到了职业困境”,然后会问一些诸如“我是否应该...

osc_gfpedeca
26分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部