当前位置: 首页 > 面试题库 >

将SHA1和RSA与java.security.Signature和MessageDigest和Cipher结合使用

班经亘
2023-03-14
问题内容

我试图了解Java java.security.Signature
类的作用。如果我计算一个SHA1消息摘要,然后使用RSAhtml" target="_blank">加密该摘要,则得到的结果与要求 Signature 类对同一事物进行签名的结果不同:

// Generate new key
KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
String plaintext = "This is the message being signed";

// Compute signature
Signature instance = Signature.getInstance("SHA1withRSA");
instance.initSign(privateKey);
instance.update((plaintext).getBytes());
byte[] signature = instance.sign();

// Compute digest
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] digest = sha1.digest((plaintext).getBytes());

// Encrypt digest
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] cipherText = cipher.doFinal(digest);

// Display results
System.out.println("Input data: " + plaintext);
System.out.println("Digest: " + bytes2String(digest));
System.out.println("Cipher text: " + bytes2String(cipherText));
System.out.println("Signature: " + bytes2String(signature));

结果(例如):

输入数据:这是正在签名的消息
摘要:62b0a9ef15461c82766fb5bdaae9edbe4ac2e067
密码文本:057dc0d2f7f54acc95d3cf5cba9f944619394711003bdd12 …
签名:7177c74bbbb871cc0af92e30d2808ebae146f22d3 …

我必须对 Signature 所做的事情有一个基本的误解-我已经对其进行了跟踪,并且它似乎正在对 MessageDigest 对象调用update
,将算法设置为我期望的SHA1,然后获取摘要,然后执行加密。是什么使结果有所不同?

编辑:

列奥尼达斯(Leonidas)让我检查了签名方案是否应该执行我认为的功能。RFC中定义了两种类型的签名:

  • RSASSA-PKCS1-v1_5
  • RSASSA-PSS

其中的第一个(PKCS1)是我上面描述的。它使用哈希函数创建摘要,然后使用私钥对结果进行加密。

所述第二算法使用随机盐值,并且是更安全的,但非确定性。如果重复使用相同的密钥,则由上面的代码产生的签名不会更改,因此我认为它可能不是PSS。

编辑:

这是bytes2string我使用的方法:

private static String bytes2String(byte[] bytes) {
    StringBuilder string = new StringBuilder();
    for (byte b : bytes) {
        String hexString = Integer.toHexString(0x00FF & b);
        string.append(hexString.length() == 1 ? "0" + hexString : hexString);
    }
    return string.toString();
}

问题答案:

好的,我已经解决了问题。我很傻 Leonidas是正确的,不仅仅是加密的哈希值,还有与摘要连接在一起的哈希算法的ID:

  DigestInfo ::= SEQUENCE {
      digestAlgorithm AlgorithmIdentifier,
      digest OCTET STRING
  }

这就是为什么它们不同的原因。



 类似资料:
  • 问题内容: 我们将Robotium与一起用于测试。虽然如此,我们想用Robotium代替Espresso,但是我们仍然有一些疑问,因为我们有一台装有Jenkins的CI机器。 Espresso使用的是Robotium ,而Robotium使用的是第一个,我们希望能够同时使用两个测试框架。可能吗?我们如何在文件中指定呢?我们如何配置我们的詹金斯机器,以针对不同的测试框架执行不同的任务? 我知道Esp

  • 问题内容: 我正在使用Hibernate Validator 4.0.2,Spring 3.0和Hibernate 3.3.2(据我所知,是JPA2之前的版本)作为JPA 1提供程序。 我发现将Validator集成到MVC层很容易(这是可行的),但是看不到如何将验证器自动集成到JPA entityManager(JPA 1)中。 基本上,我有一些实体将保留下来,但它们不是来自Web层,因此尚未经

  • 问题内容: 我是Python的新手,并且开始自学使用PyQT4.7和Python 2.6进行GUI编程(希望如此) 我刚刚从PyQT网站下载了整个PyQT / QT4软件包(包括QTDesigner),但是看起来QTDesigner看起来像个新手,因为每个小部件都看起来很棒(因为您可以看到所有属性/属性/默认设置等)编辑属性很棒,但是PyQT似乎没有设置QTDesigner与PyQT和PyQTs

  • 问题内容: 我有一个带有MySQL的远程数据库,并且将我的应用程序用户的照片存储在数据库中,作为LONGTEXT类型的数据库的一行。 我使用Base64将照片转换为字符串。 我使用JSON和PHP连接到远程数据库,因此,我必须使用Base64,因为据我所知,JSON和PHP需要在参数上发送字符串,而使用Base64可以将照片转换为字符串。 可以,但是非常慢。当我加载100 KB的照片时,会花费很多

  • 问题内容: 我的目标是通过Python将Adblock Plus与Selenium结合使用。我已经能够将其加载到扩展程序中,但是默认情况下,它不包含默认过滤器“ EasyList”。这是我到目前为止的内容: 大部分代码都是从http://selenium- python.readthedocs.org/en/latest/faq.html 剥离的 问题答案: 实际上,默认情况下,Adblock P

  • 问题内容: 我针对正常运行的Web应用程序进行了一系列功能测试,但是每个功能测试都需要通过和注释提供的类级别的设置和拆卸,因此需要JUnit 4.0或更高版本。 现在,我想使用少量的这些功能测试来执行负载测试,这些功能测试可以模拟大量请求Web应用程序相关页面的用户。为了让每个用户在JWebUnit中都有自己的“模拟浏览器”,我需要在JUnitPerf中使用TestFactory来实例化测试中的类