非对称加密 公钥私钥_选择Java加密算法第3部分–公钥/私钥非对称加密

非对称加密 公钥私钥

抽象

这是涵盖Java加密算法的三部分博客系列的第3部分。 该系列涵盖如何实现以下功能:

  1. 使用SHA–512散列
  2. 使用AES–256的单密钥对称加密
  3. RSA–4096

这第三篇文章详细介绍了如何实现非对称的RSA-4096公/私钥加密。 让我们开始吧。

免责声明

这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。

要求

我使用以下主要技术完成了本文的所有工作。 您可能可以使用不同的技术或版本来做相同的事情,但不能保证。

  • Java 1.8.0_152_x64
  • NetBeans 8.2(内部版本201609300101)
  • Maven 3.0.5(与NetBeans捆绑在一起)

下载

访问我的GitHub页面以查看我所有的开源项目。 这篇文章的代码位于项目中: thoth-cryptography

非对称加密

关于

非对称算法基于两个密钥:公钥和私钥。 公钥负责加密,私钥负责解密。 公用密钥可以自由分发。 使用公共密钥,任何客户端都可以加密一条消息,只有您(使用私有密钥)可以解密该消息(非对称算法,第3段)。

非对称算法是Internet的主力军。 像SSH,OpenPGP,SSL和TLS之类的协议依赖于非对称算法(Rouse,2016,第2段)。 使用网络浏览器进行在线银行之类的工作的人都固有地知道非对称算法的重要性。

截止目前的研究似乎表明,以下是最佳和最安全的公钥/私钥,非对称加密算法(Sheth,2017年,“选择正确的算法”,第2段):

  1. 算法: RSA
  2. 模式: ECB //确实没有,但是需要ECB才能使Java工作。
  3. 填充: OAEPWithSHA–512AndMGF1Padding
  4. 密钥大小: 4096位

RSA不是分组密码,因此ECB模式没有多大意义,但是,即使未在内部使用该模式,也需要ECB来使Java工作(Brightwell,2015年)。 OAEP提供了高度的随机性和填充性。 让我们看一个例子。

清单1是RsaTest.java单元测试。 这是以下内容的完整演示:

  1. 生成并存储RSA 4096位密钥
  2. RSA加密
  3. RSA解密

清单2显示了RsaKeyPairProducer.java 。 这是一个帮助程序类,负责产生一个新的KeyPairKeyPair对同时包含PublicKeyPrivateKey
清单3显示了RsaPrivateKeyProducer.java 。 这是一个帮助程序类,负责从byte[]再现专用PrivateKey

清单4显示了RsaPublicKeyProducer.java 。 这是一个帮助程序类,负责从byte[]复制PublicKey

清单5显示了ByteArrayWriter.java ,清单6显示了ByteArrayReader.java 。 这些是负责将byte[]写入文件的助手类。 由您决定如何存储密钥的byte[] ,但需要将其安全地存储在某个地方(文件,数据库,git存储库等)。

清单7显示了RsaEncrypter.java 。 这是一个负责加密的助手类。

最后,清单8显示了RsaDecrypter.java 。 这是一个负责解密的助手类。

清单1 – RsaTest.java类

package org.thoth.crypto.asymmetric;import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.thoth.crypto.io.ByteArrayReader;
import org.thoth.crypto.io.ByteArrayWriter;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class RsaTest {static Path privateKeyFile;static Path publicKeyFile;@BeforeClasspublic static void beforeClass() throws Exception {// Store the PrivateKey and PublicKey bytes in the ./target// diretory. Do this so it will be ignore by source control.// We don't want this file committed.privateKeyFile= Paths.get("./target/RsaPrivate.key").toAbsolutePath();publicKeyFile= Paths.get("./target/RsaPublic.key").toAbsolutePath();// Create KeyPair for RSAKeyPair keyPair= new RsaKeyPairProducer().produce();// Store the PrivateKey bytes. This is what// you want to keep absolutely safe{ByteArrayWriter writer = new ByteArrayWriter(privateKeyFile);writer.write(keyPair.getPrivate().getEncoded());}// Store the PublicKey bytes.  This you// can freely distribute so others can// encrypt messages which you can then// decrypt with the PrivateKey you keep safe.{ByteArrayWriter writer = new ByteArrayWriter(publicKeyFile);writer.write(keyPair.getPublic().getEncoded());}}@Testpublic void encrypt_and_decrypt() throws Exception {// setupPrivateKey privateKey= new RsaPrivateKeyProducer().produce(new ByteArrayReader(privateKeyFile).read());PublicKey publicKey= new RsaPublicKeyProducer().produce(new ByteArrayReader(publicKeyFile).read());RsaDecrypter decrypter= new RsaDecrypter(privateKey);RsaEncrypter encrypter= new RsaEncrypter(publicKey);String toEncrypt= "encrypt me";// runbyte[] encryptedBytes= encrypter.encrypt(toEncrypt);System.out.printf("Encrypted %s%n", new String(encryptedBytes,"UTF-8"));String decrypted= decrypter.decrypt(encryptedBytes);// assertAssert.assertEquals(toEncrypt, decrypted);}}

清单2 – RsaKeyPairProducer.java类

package org.thoth.crypto.asymmetric;import java.security.KeyPair;
import java.security.KeyPairGenerator;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class RsaKeyPairProducer {/*** Generates a new RSA-4096 bit {@code KeyPair}.** @return {@code KeyPair}, never null* @throws RuntimeException All exceptions are caught* and re-thrown as {@code RuntimeException}*/public KeyPair produce() {KeyPairGenerator keyGen;try {keyGen = KeyPairGenerator.getInstance("RSA");//keyGen.initialize(3072);keyGen.initialize(4096);return keyGen.generateKeyPair();} catch (Exception ex) {throw new RuntimeException(ex);}}
}

清单3 – RsaPrivateKeyProducer.java类

package org.thoth.crypto.asymmetric;import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class RsaPrivateKeyProducer {/*** Regenerates a previous RSA {@code PrivateKey}.** @param encodedByteArrayForPrivateKey The bytes this method* will use to regenerate a previously created {@code PrivateKey}** @return {@code PrivateKey}, never null* @throws RuntimeException All exceptions are caught* and re-thrown as {@code RuntimeException}*/public PrivateKey produce(byte[] encodedByteArrayForPrivateKey) {try {PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(encodedByteArrayForPrivateKey));return privateKey;} catch (Exception ex) {throw new RuntimeException(ex);}}
}

清单4 – RsaPublicKeyProducer.java类

package org.thoth.crypto.asymmetric;import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class RsaPublicKeyProducer {/*** Regenerates a previous RSA {@code PublicKey}.** @param encodedByteArrayForPublicKey The bytes this method* will use to regenerate a previously created {@code PublicKey}** @return {@code PublicKey}, never null* @throws RuntimeException All exceptions are caught* and re-thrown as {@code RuntimeException}*/public PublicKey produce(byte[] encodedByteArrayForPublicKey) {try {PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(encodedByteArrayForPublicKey));return publicKey;} catch (Exception ex) {throw new RuntimeException(ex);}}
}

清单5 – ByteArrayWriter.java类

package org.thoth.crypto.io;import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class ByteArrayWriter {protected Path outputFile;private void initOutputFile(Path outputFile) {this.outputFile = outputFile;}private void initOutputDirectory() {Path outputDirectory = outputFile.getParent();if (!Files.exists(outputDirectory)) {try {Files.createDirectories(outputDirectory);} catch (IOException e) {throw new RuntimeException(e);}}}public ByteArrayWriter(Path outputFile) {initOutputFile(outputFile);initOutputDirectory();}public void write(byte[] bytesArrayToWrite) {try (OutputStream os= Files.newOutputStream(outputFile);PrintWriter writer=  new PrintWriter(os);){for (int i=0; i<bytesArrayToWrite.length; i++) {if (i>0) {writer.println();}writer.print(bytesArrayToWrite[i]);}} catch (IOException ex) {throw new RuntimeException(ex);}}
}

清单6 – ByteArrayReader.java类

package org.thoth.crypto.io;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Scanner;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class ByteArrayReader {protected Path inputFile;public ByteArrayReader(Path inputFile) {this.inputFile = inputFile;}public byte[] read() {try (Scanner scanner=  new Scanner(inputFile);ByteArrayOutputStream baos= new ByteArrayOutputStream();){while (scanner.hasNext()) {baos.write(Byte.parseByte(scanner.nextLine()));}baos.flush();return baos.toByteArray();} catch (IOException ex) {throw new RuntimeException(ex);}}
}

清单7 – RsaEncrypter.java类

package org.thoth.crypto.asymmetric;import java.security.PublicKey;
import javax.crypto.Cipher;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class RsaEncrypter {protected RsaCipher cipher;public RsaEncrypter(PublicKey key) {this.cipher = new RsaCipher(Cipher.ENCRYPT_MODE, key);}public byte[] encrypt(String message) {try {return cipher.update(message.getBytes("UTF-8")).doFinal();} catch (Exception e) {throw new RuntimeException(e);}}
}

清单8 – RsaDecrypter.java类

package org.thoth.crypto.asymmetric;import java.security.PrivateKey;
import javax.crypto.Cipher;/**** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class RsaDecrypter {protected RsaCipher cipher;public RsaDecrypter(PrivateKey key) {this.cipher = new RsaCipher(Cipher.DECRYPT_MODE, key);}public String decrypt(byte[] message) {try {return new String(cipher.update(message).doFinal(), "UTF-8");} catch (Exception e) {throw new RuntimeException(e);}}}

摘要

加密并不容易。 简单的示例将为您的应用程序带来带有安全漏洞的实现。 如果需要公用/专用密钥,非对称加密算法,请使用具有4096位密钥的RSA / ECB / OAEPWithSHA–512AndMGF1Padding。

参考资料

Sheth,M.(2017年4月18日)。 Java密码学中的加密和解密。 从https://www.veracode.com/blog/research/encryption-and-decryption-java-cryptography检索。

  • 最佳算法,模式和填充
  • 使用4096位密钥

华盛顿州布莱特韦尔,雨披。 (2015年5月4日)。 ECB模式与RSA加密一起使用是否安全? 从https://crypto.stackexchange.com/questions/25420/is-ecb-mode-safe-to-use-with-rsa-encryption检索。

  • 欧洲央行不适用; Java不会在幕后使用它。
  • RSA使用随机性和填充来避免ECB问题,即相同的明文生成相同的密文

玛丽莲娜。 (2016年11月29日)。 Java –非对称密码术示例。 从https://www.mkyong.com/java/java-asymmetric-cryptography-example/检索。

  • 将公用/专用密钥写入文件
  • 从文件读取公钥/私钥
  • 加密与解密

密钥大小。 (2017年10月12日)。 维基百科。 取自https://en.wikipedia.org/wiki/Key_size 。

  • 到2030年,2048位密钥就足够了
  • 如果需要2030年以后的安全性,则应使用3072位的RSA密钥长度

用户4982。 (2013年11月4日)。 IV如何与RSA加密关联使用? 取自https://crypto.stackexchange.com/questions/11403/how-are-ivs-used-in-association-with-rsa-encryption 。

  • IV值不适用于RSA

翻译自: https://www.javacodegeeks.com/2017/12/choosing-java-cryptographic-algorithms-part-3-public-private-key-asymmetric-encryption.html

非对称加密 公钥私钥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 命令之 compress -- unix 档案压缩命令

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;压缩文件&#xff08;二&#xff09;解压文件一、命令介绍 compress 命令使用“Lempress-Ziv”编码压缩数据文件。compress 是一个相当古老的 unix 档案压缩程序&#xff0c;文件经它压缩后&#xff0…

计算机电源风扇维修,电脑电源开关维修和电源风扇加油图解全过程.doc

窗体顶端窗体底端电源开关维修及电源风扇加油图解全过程2010-05-06 17:56:19 来源&#xff1a;计算机故障查询网 浏览&#xff1a;804次-今天一朋友拿了部联想电脑(虽然俺不喜欢,但每个人有自己的爱好,就没说啥)给我,说让我帮他的电脑体检一下,说开不了机于是开展程序化工作,朋…

内部收益率irr_介绍一个神器,内部收益率IRR

内部回报率IRR这个概念&#xff0c;艾米姐在很多地方都讲到了。可以这么说&#xff0c;任何的理财产品&#xff0c;都可以用这个概念来测算一下收益到底如何。听起来IRR确实很强大啊。那它到底是个什么东东呢&#xff1f;今天就来说一说。一、什么是内部收益率IRR&#xff1f;这…

如何在Java中处理ConcurrentModificationException? 在循环中从ArrayList中删除元素时要当心...

从Java中从ArrayList中删除元素时常见的问题之一是ConcurrentModificationException。 如果您对索引使用经典的for循环或增强的for循环&#xff0c;并尝试使用remove()方法从ArrayList中remove()元素&#xff0c;则将获得C oncurrentModificationException但如果使用Iterator的…

Linux 命令之 zip -- 压缩文件

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;压缩指定目录及其包含的内容&#xff08;二&#xff09;压缩指定目录及其包含的内容&#xff0c;并选择压缩效率一、命令介绍 zip 命令可以将一个或多个文件放入一个压缩存档中&#xff0c;文件经它压…

南安职业中专学校计算机专业,南安职专:国家级重点职业中专学校

原标题&#xff1a;南安职专:国家级重点职业中专学校学校创办于1984年&#xff0c;现有教职工252人&#xff0c;在校生4152人。2004年被首批重新确认为国家级重点职业中专学校&#xff0c;2012年9月被确认为国家中等职业教育改革发展示范学校建设项目校。2016年1月份被确认为福…

python eel 多线程_Python 基础

input() 用于输入print() 用于输出数据类型:1、整数 、浮点数‘ / ‘ 表示除 得出的结果一定是个浮点型.‘ // ‘ 表示除 得出的结果一定是整数.(如果是小数会自动取整)‘ % ‘ 表示除 取余数(自动取得小数点后面的数)2、字符串(‘’ / “”)可以使用 ‘ \ ‘ 转义, r表示内部的…

Linux 命令之 unzip -- 解压缩文件

文章目录一、命令介绍二、命令选项三、命令示例&#xff08;一&#xff09;解压缩文件&#xff08;二&#xff09;将指定压缩文件解压到指定目录下&#xff08;三&#xff09;查看压缩包内的文件列表及有关的压缩信息&#xff08;四&#xff09;验证压缩文件是否完整一、命令介…

网络研讨室_网络研讨会:Java 9的第一印象–构建可伸缩企业应用程序的新方法...

网络研讨室在此网络研讨会上听我们对新Java版本的一些初步想法 关于Java 9的新版本&#xff0c;有很多宣传。将Java平台迁移到模块上&#xff0c;由Mark Reinhold领导的专门团队进行了近十年的艰苦工作。 除了备受期待的Project Jigsaw&#xff0c;此版本还包含许多其他令人兴…

react 日历组件_anujs1.5.1支持React.Suspense与lazy

React16是一个实验版本&#xff0c;除了测试它的新fiber架构外&#xff0c;还添加了大量新功能。其他React.Suspense与React.lazy就是重磅中的重磅。随着前端的APP化&#xff0c;不断集成功能&#xff0c;页面越来越大&#xff0c;bundle size以MB为单位&#xff0c;我们需要拆…

计算机永远无法处理日语所具有的暧昧性,计算机永远无法处理日语所具有的暧昧性。( )...

计算机永远无法处理日语所具有的暧昧性。( )更多相关问题[单选] 分体式变频空调器的节流装置选用的是()[单选] 当制冷压缩机效率降低时&#xff0c;其()[判断题] 流体以层流流态换热强度要强于湍流流态强度[单选] 一次回风式空调系统的调节方法&#xff0c;是控制()&#xff0c…

Linux 命令之 xz -- POSIX 平台的具有高压缩率的压缩工具

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;压缩文件&#xff0c;压缩成功后删除原文件&#xff08;二&#xff09;解压文件&#xff0c;且不删除原文件&#xff08;三&#xff09;根据自定义的压缩率压缩文件&#xff08;四&#xff09;借助 xar…

packt_Packt发行的$ 5 Java编程书籍:精通Java 9,Java 9高性能

packt你好&#xff0c;极客&#xff01; 今天&#xff0c;我们为您带来一些激动人心的消息&#xff01; Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 本周&#xff0c;我们提供Java相关书籍的折扣&#xff0c;以帮助您了解和掌握Java。 他们全都打折到每本书5…

redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅

欢迎关注赵强老师微信公众号&#xff1a;myitshareRedis 作为一个publish/subscribe server&#xff0c;起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型&#xff0c;当发布者通过publish命令向Redis server发送特定类型…

上海大学计算机考研数一数二,2021年考研成绩出来了!上海大学数二人均135+,“神仙打架”现场...

原标题&#xff1a;2021年考研成绩出来了&#xff01;上海大学数二人均135&#xff0c;“神仙打架”现场文/跳跳妈妈谈教育2000年代初期&#xff0c;电视上流行这样一句话&#xff0c;“二十一世纪什么最珍贵&#xff1f;人才&#xff01;”时间如长河不断流逝&#xff0c;步入…

对称密钥加密算法 对称轮数_选择Java加密算法第2部分–单密钥对称加密

对称密钥加密算法 对称轮数抽象 这是涵盖Java加密算法的三部分博客系列的第2部分。 该系列涵盖如何实现以下功能&#xff1a; 使用SHA–512散列 AES–256 RSA–4096 这第二篇文章详细介绍了如何实现单密钥对称AES-256加密。 让我们开始吧。 免责声明 这篇文章仅供参考。 在…

Linux 命令之 unxz -- 解压缩文件

文章目录一、命令介绍二、命令示例&#xff08;一&#xff09;解压文件&#xff08;二&#xff09;将指定的压缩文件解压缩到指定的目录下&#xff0c;且可以重命名一、命令介绍 unxz 命令用于解压缩使用 xz 压缩的文件包&#xff0c;实际 unxz 相当于 xz -d 二、命令示例 &…

计算机配置界面在那,在哪里设置关机画面?设置为原来的经典界面?

电脑故障现象&#xff1a;我用的系统是winxp&#xff0c;关机出现的画面是那种下拉式菜单“注销、重启、关机、取消”&#xff0c;我想用的不是这种下拉式菜单&#xff0c;是并列图标那种&#xff0c;请问在哪里设置&#xff1f;(电脑入门到精通网 www.58116.cn)一般解决方法&a…

程序代码移植和烧录需要注意什么_购买建站模板需要注意什么问题

购买建站模板需要注意什么问题?现在市面上出现的建站工具质量参差不齐&#xff0c;但是如此多的建站模板&#xff0c;应该选择哪个呢&#xff1f;如此多的建站工具平台应该怎么样选择呢&#xff1f;这里我们来聊一聊。北京网站建设公司—东浩联创现在非常多站长都会购买一些定…

java字符串各个字符计数_没有科学计数法的Java十进制数的简单字符串表示形式...

java字符串各个字符计数Java中用于十进制数字的主要类型 /对象是float / Float &#xff0c; double / Double和BigDecimal 。 在每种情况下&#xff0c;其“默认”字符串表示形式都是“计算机科学计数法”。 这篇文章演示了一些简单的方法&#xff0c;可以在没有科学符号的情况…