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

RSA算法在Java中的实现不正常

盖嘉庆
2023-03-14

理论上我知道,如果n=33e(公钥)=3d(私钥)=7我可以使用biginteger类用modpow(e,n)加密明文并用modpow(d,n)解密,但解密后明文与第一次不一样。

下面是我的代码:

  public class KeyTest {
private BigInteger n = new BigInteger("33");
private BigInteger e = new BigInteger("3");
private BigInteger d = new BigInteger("7");

public static void main(String[] args) {
    KeyTest test = new KeyTest();

    BigInteger plaintext = new BigInteger("55");
    System.out.println("Plain text: " + plaintext);

    BigInteger ciphertext = test.encrypt(plaintext);
    System.out.println("Ciphertext: " + ciphertext);

    BigInteger decrypted = test.decrypt(ciphertext);
    System.out.println("Plain text after decryption: " + decrypted);
}

public BigInteger encrypt(BigInteger plaintext) {

    return plaintext.modPow(e, n);
}

public BigInteger decrypt(BigInteger ciphertext) {

    return ciphertext.modPow(d, n);
}
}

输出为:

Plain text: 55 Ciphertext: 22 Plain text after decryption: 22

共有1个答案

沈博涉
2023-03-14

您的明文(55)大于模数(33),因此实际上无法加密消息。考虑以下略有不同的示例:

  • p=11
  • Q=17
  • n=187
  • phi(n)=160
  • 选择E=3
  • 如果d=107e*d=321=1 mod phi(n)

因此将代码更改为:

  private BigInteger n = new BigInteger("187");
  private BigInteger e = new BigInteger("3");
  private BigInteger d = new BigInteger("107");

  public static void main(String[] args) {
    KeyTest test = new KeyTest();

    BigInteger plaintext = new BigInteger("55");
    System.out.println("Plain text: " + plaintext);

    BigInteger ciphertext = test.encrypt(plaintext);
    System.out.println("Ciphertext: " + ciphertext);

    BigInteger decrypted = test.decrypt(ciphertext);
    System.out.println("Plain text after decryption: " + decrypted);
  }

  public BigInteger encrypt(BigInteger plaintext) {

    return plaintext.modPow(e, n);
  }

  public BigInteger decrypt(BigInteger ciphertext) {

    return ciphertext.modPow(d, n);
  }
}

输出:

Plain text: 55
Ciphertext: 132
Plain text after decryption: 55
 类似资料:
  • 问题内容: 我想为我的应用程序提供基于RSA算法的简单许可机制。 有免费的RSA库吗? 问题答案: 只需使用和软件包即可。它在Java标准平台中。 官方文档链接: 包装文件 包装文件

  • 我试图在Java中实现Prim的算法,用于我的图形HashMap LinkedList和一个包含连接顶点和权重的类Edge: 我的想法是,从一个给定的顶点开始:1)将所有顶点保存到一个LinkedList中,这样每次访问它们时我都可以删除它们2)将路径保存到另一个LinkedList中,这样我就可以得到我的最终MST 3)使用PriorityQueue找到最小权重 最后我需要MST,边数和总重量。

  • 本文向大家介绍java 非对称加密算法RSA实现详解,包括了java 非对称加密算法RSA实现详解的使用技巧和注意事项,需要的朋友参考一下 现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单。 初始化密钥: 1、私钥加密,公钥解密: 2、公钥加密,私钥解密: 根据

  • 本文向大家介绍python实现RSA加密(解密)算法,包括了python实现RSA加密(解密)算法的使用技巧和注意事项,需要的朋友参考一下 RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其密钥的长度足够长,用RSA加密

  • 本文向大家介绍使用python实现rsa算法代码,包括了使用python实现rsa算法代码的使用技巧和注意事项,需要的朋友参考一下 RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名。 维基百科给出的RSA算法简介如下: 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥: 随意选择两个大的质数p和q,