问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用16进制编码的RSA公钥进行RSA加密

发布网友 发布时间:2022-04-22 09:37

我来回答

2个回答

热心网友 时间:2022-05-27 11:12

我们来回顾一下RSA的加密算法。我们从公钥加密算法和签名算法的定义出发,用比较规范的语言来描述这一算法。  RSA公钥加密*包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。  (PK,SK)\leftarrowKeyGen(\lambda)。密钥生成算法以安全常数\lambda作为输入,输出一个公钥PK,和一个私钥SK。安全常数用于确定这个加密算法的安全性有多高,一般以加密算法使用的质数p的大小有关。\lambda越大,质数p一般越大,保证*有更高的安全性。在RSA中,密钥生成算法如下:算法首先随机产生两个不同大质数p和q,计算N=pq。随后,算法计算欧拉函数\varphi(N)=(p-1)(q-1)。接下来,算法随机选择一个小于\varphi(N)的整数e,并计算e关于\varphi(N)的模反元素d。最后,公钥为PK=(N,e),私钥为SK=(N,d)。  CT\leftarrowEncrypt(PK,M)。加密算法以公钥PK和待加密的消息M作为输入,输出密文CT。在RSA中,加密算法如下:算法直接输出密文为CT=M^e\mod\varphi(N)  M\leftarrowDecrypt(SK,CT)。解密算法以私钥SK和密文CT作为输入,输出消息M。在RSA中,解密算法如下:算法直接输出明文为M=CT^d\mod\varphi(N)。由于e和d在\varphi(N)下互逆,因此我们有:CT^d=M^{ed}=M\mod\varphi(N)  所以,从算法描述中我们也可以看出:公钥用于对数据进行加密,私钥用于对数据进行解密。当然了,这个也可以很直观的理解:公钥就是公开的密钥,其公开了大家才能用它来加密数据。私钥是私有的密钥,谁有这个密钥才能够解密密文。否则大家都能看到私钥,就都能解密,那不就乱套了。  =================分割线=================  我们再来回顾一下RSA签名*。签名*同样包含3个算法:KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)。  (PK,SK)\leftarrowKeyGen(\lambda)。密钥生成算法同样以安全常数\lambda作为输入,输出一个公钥PK和一个私钥SK。在RSA签名中,密钥生成算法与加密算法完全相同。  \sigma\leftarrowSign(SK,M)。签名算法以私钥SK和待签名的消息M作为输入,输出签名\sigma。在RSA签名中,签名算法直接输出签名为\sigma=M^d\mod\varphi(N)。注意,签名算法和RSA加密*中的解密算法非常像。  b\leftarrowVerify(PK,\sigma,M)。验证算法以公钥PK,签名\sigma以及消息M作为输入,输出一个比特值b。b=1意味着验证通过。b=0意味着验证不通过。在RSA签名中,验证算法首先计算M'=\sigma^e\mod\varphi(N),随后对比M'与M,如果相等,则输出b=1,否则输出b=0。注意:验证算法和RSA加密*中的加密算法非常像。  所以,在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。这也可以直观地进行理解:对一个文件签名,当然要用私钥,因为我们希望只有自己才能完成签字。验证过程当然希望所有人都能够执行,大家看到签名都能通过验证证明确实是我自己签的。  =================分割线=================  那么,为什么题主问这么一个问题呢?我们可以看到,RSA的加密/验证,解密/签字过程太像了。同时,RSA*本身就是对称的:如果我们反过来把e看成私钥,d看成公钥,这个*也能很好的执行。我想正是由于这个原因,题主在学习RSA*的时候才会出现这种混乱。那么解决方法是什么呢?建议题主可以学习一下其他的公钥加密*以及签名*。其他的*是没有这种对称性质的。举例来说,公钥加密*的话可以看一看ElGamal加密,以及更安全的Cramer-Shoup加密。签名*的话可以进一步看看ElGamal签名,甚至是BLS签名,这些*可能能够帮助题主更好的弄清加密和签名之间的区别和潜在的联系。  至于题主问的加密和签名是怎么结合的。这种*叫做签密方案(SignCrypt),RSA中,这种签密方案看起来特别特别像,很容易引起混乱。在此我不太想详细介绍RSA中的加密与签字结合的方案。我想提醒题主的是,加密与签字结合时,两套公私钥是不同的。

热心网友 时间:2022-05-27 11:12

java加密方法如下:

Java code
String modeHex = "D548C6267CC503F1E926776A97F8644CAA67167E8FA5D74FD1F4E0BCB3608BD1583E41B102B5B4617E53B90A0C67EA652F8D96B40CFDDA6BC1501432ADCE15E4B5B916568893C94FF3CAC5ED5942FC604BAD1B12DF7683B25C6702BD8CF1BE2F5A4FFC97C82E42FD91E49A6EFF379F5F022F36E5395D64FC9430EEFCAC55F0A5";
String exponentHex = "10001";

KeyFactory factory = KeyFactory.getInstance("RSA");

BigInteger n = new BigInteger(modeHex, 16);
BigInteger e = new BigInteger(exponentHex, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(n, e);

RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec);
Cipher enc = Cipher.getInstance("RSA");
enc.init(Cipher.ENCRYPT_MODE, pub);

byte[] encryptedContentKey = enc.doFinal(messageg.getBytes("GB2312"));

String result = new String(Hex.encodeHex(encryptedContentKey));java加密方法如下:

Java code
String modeHex = "D548C6267CC503F1E926776A97F8644CAA67167E8FA5D74FD1F4E0BCB3608BD1583E41B102B5B4617E53B90A0C67EA652F8D96B40CFDDA6BC1501432ADCE15E4B5B916568893C94FF3CAC5ED5942FC604BAD1B12DF7683B25C6702BD8CF1BE2F5A4FFC97C82E42FD91E49A6EFF379F5F022F36E5395D64FC9430EEFCAC55F0A5";
String exponentHex = "10001";

KeyFactory factory = KeyFactory.getInstance("RSA");

BigInteger n = new BigInteger(modeHex, 16);
BigInteger e = new BigInteger(exponentHex, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(n, e);

RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec);
Cipher enc = Cipher.getInstance("RSA");
enc.init(Cipher.ENCRYPT_MODE, pub);

byte[] encryptedContentKey = enc.doFinal(messageg.getBytes("GB2312"));

String result = new String(Hex.encodeHex(encryptedContentKey));java加密方法如下:java加密方法如下:

Java code
String modeHex = "D548C6267CC503F1E926776A97F8644CAA67167E8FA5D74FD1F4E0BCB3608BD1583E41B102B5B4617E53B90A0C67EA652F8D96B40CFDDA6BC1501432ADCE15E4B5B916568893C94FF3CAC5ED5942FC604BAD1B12DF7683B25C6702BD8CF1BE2F5A4FFC97C82E42FD91E49A6EFF379F5F022F36E5395D64FC9430EEFCAC55F0A5";
String exponentHex = "10001";

KeyFactory factory = KeyFactory.getInstance("RSA");

BigInteger n = new BigInteger(modeHex, 16);
BigInteger e = new BigInteger(exponentHex, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(n, e);

RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec);
Cipher enc = Cipher.getInstance("RSA");
enc.init(Cipher.ENCRYPT_MODE, pub);

byte[] encryptedContentKey = enc.doFinal(messageg.getBytes("GB2312"));

String result = new String(Hex.encodeHex(encryptedContentKey));
Java code
String modeHex = "D548C6267CC503F1E926776A97F8644CAA67167E8FA5D74FD1F4E0BCB3608BD1583E41B102B5B4617E53B90A0C67EA652F8D96B40CFDDA6BC1501432ADCE15E4B5B916568893C94FF3CAC5ED5942FC604BAD1B12DF7683B25C6702BD8CF1BE2F5A4FFC97C82E42FD91E49A6EFF379F5F022F36E5395D64FC9430EEFCAC55F0A5";
String exponentHex = "10001";

KeyFactory factory = KeyFactory.getInstance("RSA");

BigInteger n = new BigInteger(modeHex, 16);
BigInteger e = new BigInteger(exponentHex, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(n, e);

RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec);
Cipher enc = Cipher.getInstance("RSA");
enc.init(Cipher.ENCRYPT_MODE, pub);

byte[] encryptedContentKey = enc.doFinal(messageg.getBytes("GB2312"));

String result = new String(Hex.encodeHex(encryptedContentKey));java加密方法如下:

Java code
String modeHex = "D548C6267CC503F1E926776A97F8644CAA67167E8FA5D74FD1F4E0BCB3608BD1583E41B102B5B4617E53B90A0C67EA652F8D96B40CFDDA6BC1501432ADCE15E4B5B916568893C94FF3CAC5ED5942FC604BAD1B12DF7683B25C6702BD8CF1BE2F5A4FFC97C82E42FD91E49A6EFF379F5F022F36E5395D64FC9430EEFCAC55F0A5";
String exponentHex = "10001";

KeyFactory factory = KeyFactory.getInstance("RSA");

BigInteger n = new BigInteger(modeHex, 16);
BigInteger e = new BigInteger(exponentHex, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(n, e);

RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec);
Cipher enc = Cipher.getInstance("RSA");
enc.init(Cipher.ENCRYPT_MODE, pub);

byte[] encryptedContentKey = enc.doFinal(messageg.getBytes("GB2312"));

String result = new String(Hex.encodeHex(encryptedContentKey));java加密方法如下:

Java code
String modeHex = "D548C6267CC503F1E926776A97F8644CAA67167E8FA5D74FD1F4E0BCB3608BD1583E41B102B5B4617E53B90A0C67EA652F8D96B40CFDDA6BC1501432ADCE15E4B5B916568893C94FF3CAC5ED5942FC604BAD1B12DF7683B25C6702BD8CF1BE2F5A4FFC97C82E42FD91E49A6EFF379F5F022F36E5395D64FC9430EEFCAC55F0A5";
String exponentHex = "10001";

KeyFactory factory = KeyFactory.getInstance("RSA");

BigInteger n = new BigInteger(modeHex, 16);
BigInteger e = new BigInteger(exponentHex, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(n, e);

RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec);
Cipher enc = Cipher.getInstance("RSA");
enc.init(Cipher.ENCRYPT_MODE, pub);

byte[] encryptedContentKey = enc.doFinal(messageg.getBytes("GB2312"));

String result = new String(Hex.encodeHex(encryptedContentKey));
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
照海的准确位置和作用 墙面刷白需要哪些东西 墙壁刷白用哪些材料 墙体刷白需要哪些材料 墙面刷白需要哪些材料 刷白墙用的是什么材料 墙刷白要哪些材料 c语言中什么算是实型数据 当你面向东南面时,前面是什么面,后面什么面,左边是什么面,右边是... 面向西面,左边是___,右边是___,后面是__ rsa加密法 详细解释 rsa加密rsa加密rsa加密? 如何在浏览器端实现RSA公私钥对生成,加解密 如何在IOS中使用RSA加密,能够与.NET的服务器互通 如何实现用javascript实现rsa加解密 android rsa加解密私钥和公钥怎么用 高分求java的RSA 和IDEA 加密解密算法 非常完整的rsa加密解密软件 有多完整 ios开发rsa加密怎么生成秘钥 rsa的加密算法可以使用什么软件实现密码加密 求RSA加密软件! 中远国际期货新手开户需要什么资料吗 做期货的朋友们,知道这几个公司是正规的吗。 可靠吗 期货平台是正规的吗? 中国在哪些产品上还有比较优势? 怎么设置苹果手机的id 现在的期货交易平台哪个是正规的?怎么判断? 国内的期货公司正规吗? 苹果手机怎么改id? 国内比较大比较好的期货公司有哪些 android 提交的rsa加密,服务端怎么解密 [求助}如何对excel进行RSA加密 银联支付接口使用rsa 数据加密。明文密钥都是16进制的字符串,加密结果和对方给的小工具加密的结果不一样 RSA加密解密问题 RSA加密算法,求大神帮解答 江苏成人高考有哪些优势,你知道吗? word文件的表格复制到🆔文件不显示是怎么回事 江苏成考录取分数线2021 word里面表格一页放不下,第二页不显示 江苏成人高考热门问题有哪些?成考小编告诉你! word里面粘贴表格怎么显示不出来 听说今后江苏成考越来越难? 江苏成人高考的入学考试难吗?要考多少分呀 梅艳芳是因为什么原因去世的? 江苏省成人高考 word复制表格到另一个word怎么保持格式? 江苏成人高考成绩如何查询,你知道吗? word文档输入目录然后插入表格怎么第二页出不来 我要参加江苏省成人高考,都有哪些步骤 参加江苏成考专业应该如何的去选择呢?