当前位置: 首页 > 知识库问答 >
问题:

java和python中的RSA加密给出了不同的加密结果

袁青青
2023-03-14
import rsa
import base64
import requests

rsa_mod = int("a34c87e072501474c5b75dbfb179bd240123bdcda2f79c450b3224bdbe2527ded280706a727fcced28a4a00187165285df8bf0c37721c682808502d89ac05d1cb521babdfee8d4cd0e12169a139338418b0b8ddb0d0066e027bd1c4bb18928b996416a1f671e0754428c53b2234cb5cfc67adbd93006d6c4ca4f5459b8cb22e675ee04e045387db331659e3143c71c941c092fe56e665f8ae21c73153a31a287fb85178d51d710ebb33ad6b437af5fe073b4a2a969920364fd595f824d4b0bca41216b66865fc8e020ef3b36ddc3613f6fdd8559471cc7165384562e20ca422f32a12e9a064279d80ad03d1d111922993e8e62e94da9ae4cf0bd7a08708f047b", 16)
rsa_exp = int("010001", 16)
password = "password"

rsa_key = rsa.PublicKey(rsa_mod, rsa_exp)

encrypedPassword = base64.b64encode(rsa.encrypt(password.encode('utf-8'), rsa_key))

print(encrypedPassword)
b'P7VLrCteJCfoV4UELktZlDjjcQRRhLOcRhoqdd3H2rKe3KQpWPfBfMQZhxpF7NDoNx5KXDnXO7Ew9o87egxOUbAHvmckrorD4VQHNauoSjQR03ibxfNSMwRh8CJOOJVi6wykvijIPHuJBZtNI8XhgNYn8LJLz4jN37MJmocCi80oB/UCSsS3v87mUYo6Ik1xTmqiOxojRLzhw9Lfw1A33pEj4NfiwnLRjE7jd1evAtfgTUiOLXhaUv5J8PYTwzUmLZTft+8JsLEUzaYSfAxbL6M0s6s62dFCKmrAmrKtPwl8VD+6BlWCLdt1j2JNQuND+OZIpjyY7KadTGtCA8if3A=='
private final String PASSWORD = "password";
private final String publickey_mod= "a34c87e072501474c5b75dbfb179bd240123bdcda2f79c450b3224bdbe2527ded280706a727fcced28a4a00187165285df8bf0c37721c682808502d89ac05d1cb521babdfee8d4cd0e12169a139338418b0b8ddb0d0066e027bd1c4bb18928b996416a1f671e0754428c53b2234cb5cfc67adbd93006d6c4ca4f5459b8cb22e675ee04e045387db331659e3143c71c941c092fe56e665f8ae21c73153a31a287fb85178d51d710ebb33ad6b437af5fe073b4a2a969920364fd595f824d4b0bca41216b66865fc8e020ef3b36ddc3613f6fdd8559471cc7165384562e20ca422f32a12e9a064279d80ad03d1d111922993e8e62e94da9ae4cf0bd7a08708f047b";
private final String publickey_exp = "010001" ;

private String encryptPassWordWithRSAKey() {
  BigInteger module = new BigInteger(publickey_mod, 16);
  BigInteger exponent = new BigInteger(publickey_exp, 16);
  try {
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(module, exponent);
    RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(publicKeySpec);

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    byte[] encryptedPassWord = cipher.doFinal(PASSWORD.getBytes(StandardCharsets.UTF_8));
    return Base64.getEncoder().encodeToString(encryptedPassWord);
} catch (IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException e) {
    System.out.println("Exception in encryptPassWordWithRSAKey method of LoginExecutor");
    e.printStackTrace();
    return null;
  }
}

public String getEncryptedkey(){
  return this.encryptPassWordWithRSAKey();
}
SrA4QK2FXFIB/c5ZOuUJ+SZLTcgYyp3eWYD7TTo7krfiyRxbSekVQHAooBzL/k8/DQwbUxR5InUKHxAqUMZ9MU87H+ULXOGi9a0N/37ymTXBnqGna8XvjtnpeVG8h5PXilZdLqeGDdn5wuNNtN6+61rPsifYJy2M9BUdXIfs2EyS0LQixRkPcfQN4Qd+K6UPBLpc7D4SUkTMJSDgp7umZeifz+hEPmE+FYEBtmDf1uLFB4/B9srgyDxLXjFZS/gk27EYrtEuiPbR0pmZs75JCRFk0Y5p1wQEmgCujs3+PuJTXdyHdrO4fxqTGHzKZRau2zZOaT3RWoU/x/u8QSKfZg==

我已经尝试使用cipher.getinstance(“rsa/ecb/pkcs1padding”),但没有给出预期的结果。

感谢所有的帮助。祝你有美好的一天。

共有1个答案

萧亦
2023-03-14

停止了一段时间的工作。回到这里,发现我犯了一个非常愚蠢的错误。加密是对的。当我将password作为查询参数传递时,我需要用url编码替换'='、'+'和'/'。参考:w3schools.com/tags/ref_urlencode.asp。

下面是我添加的最后代码:

String urlSafePassword = Base64.getEncoder().encodeToString(encryptedPassWord);
            urlSafePassword.replace("/", "%2F");
            urlSafePassword.replace("+", "%2B");
            urlSafePassword.replace("=", "%3D");
            return urlSafePassword;

我一直在想我的内疚类型。

 类似资料:
  • 我正在检查一个用Python编写的代码,它用来生成一个RSA公钥对。 它会生成keypair,但是在代码的末尾,它会再次运行ssh-keygen。我不知道为什么这样做。因为,rsa.generate()本身将生成keypair,我们将其导出到两个单独的文件中。为什么需要再次运行ssh-keygen? 下面是代码中的几行: 文件pub将存储公钥,id_rsa将存储来自rsa.generate()函数

  • 我正面临一个奇怪的问题。我的服务器正在给我公钥来加密用户名和密码。 如果使用RSA/ECB/PKCS1Padding(Cipher Cipher=Cipher.getInstance(“RSA/ECB/PKCS1Padding”)算法,则会得到不同的结果。同样的算法在Java服务器和android上使用,但是得到的结果不同。 请帮助确定问题所在? 多谢了。

  • 问题内容: 我想用RSA加密对String进行加密。我的公钥/私钥已生成并存储在DB中。在android中,我使用以下代码: 出于调试目的,我尝试使用相同的参数调用此方法两次,并且String结果相似(符合预期)。 我想在Java中生成相同的加密字符串。但是,“ android.util.Base64”类在Java中不可用,因此我尝试使用默认的Base64类: 但是Android中生成的Strin

  • 我正在尝试使用java对用户电子邮件id进行RSA加密,并尝试使用php进行解密。但我没有成功。以下是详细信息 java中的源代码: 私钥: RSA 加密输出: 和Bas64编码输出: php解密代码 php输出返回none。。。

  • 我在python上做加密,在Java上尝试解密,但总是得到解密错误 我在Java有部分加密和解密信息代码,用RSA编码解密: 不幸的是,我无法在这段代码中进行更改,所以我所能做的就是在python部分中进行更改。这部分工作正常。为了检查,我使用以下代码进行加密: 当我使用来自Java代码的结果进行加密,并将这个结果用于解密Java文件--所有的工作都很好。我需要相同的加密部分,但编写与Python

  • 我需要在Python中使用RSA加密和解密的帮助。 我正在创建一个私钥/公钥对,用密钥加密一条消息,并将消息写入一个文件。然后我从文件中读取密文,并使用密钥解密文本。 谁能帮我写这个代码,让解密从文件中读取密文,然后使用密钥解密密文?