gpt4 book ai didi

java - Capicom SHA1 哈希值在 Java 中的计算方式不同

转载 作者:行者123 更新时间:2023-12-01 04:40:49 26 4
gpt4 key购买 nike

我正在使用CAPICOM装配VBS加密某些逻辑text ,这效果很好,但是当尝试使用 Java 复制相同内容时,问题就开始了。 .

这是我的 VBS 代码:

Option Explicit

Dim strToEncrypt: strToEncrypt = "Content-Type: plain/text; name=""C:\Users\Luigi\Desktop\hello.txt""" & vbCrLf & _
"Content-Disposition: attachment; filename=""C:\Users\Luigi\Desktop\hello.txt""" & vbCrLf & _
"test"
Dim encryptedStr: encryptedStr = CRYPTO_SHA1(strToEncrypt)

WScript.Echo encryptedStr

Private Function CRYPTO_SHA1(strData) 'As String
Const CAPICOM_HASH_ALGORITHM_SHA1 = 0

Dim hash: Set hash = CreateObject("CAPICOM.HashedData")
Dim util: Set util = CreateObject("CAPICOM.Utilities")
Dim stm: Set stm = CreateObject("ADODB.Stream")

stm.Open
stm.Type = 2 'adTypeText
stm.Charset = "us-ascii"
stm.WriteText strData
stm.Position = 0
stm.Type = 1 'adTypeBinary

hash.Algorithm = CAPICOM_HASH_ALGORITHM_SHA1
hash.Hash stm.Read

CRYPTO_SHA1 = util.Base64Encode(util.HexToBinary(hash.Value))
CRYPTO_SHA1 = Left(CRYPTO_SHA1, Len(CRYPTO_SHA1)-Len(vbCrLf))

stm.Close
Set stm = Nothing
Set util = Nothing
Set hash = Nothing
End Function

通过调试上面的代码,我可以得到以下结果:

Hash对象值为:

hash.Value = 636D0172D7FAC85AF9DB57FAE6C7D98B17DE5159

最终结果为encryptedStr是:

encryptedStr = Y20Bctf6yFr521f65sfZixfeUVk=
<小时/>

所以,在 Java我正在尝试复制相同的内容,并且我认为这可以通过...来完成

  1. 获取SHA1 String 的哈希值或InputStream (因为在 VBS 代码中有一个 stm 对象代表 Stream )。

  2. 使用一些HexToBinary方法(通过实现此方法,因为默认情况下 Java 中不存在此方法)。

  3. 使用BASE64Encoder对于二进制 String来自SHA1哈希。

  4. 最后,使用Left方法来自org.apache.commons.lang.StringUtils (复制 VBS 代码),然后输出 encryptedStrbase64 String .

这是我迄今为止在 Java 中尝试过的至少生成 SHA1 的方法。哈希(应该与 hash.Value 中的 VBS 相同:

package my.package;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

public class SHA1Encrypt {

public static void main(String[] args) throws Exception {

String str = "Content-Type: plain/text; name=\"C:\\Users\\Luigi\\Desktop\\hello.txt\"" + "\n" +
"Content-Disposition: attachment; filename=\"C:\\Users\\Luigi\\Desktop\\hello.txt\"" + "\n" +
"test";

String SHA1FromString = getSHA1FromString(str);
String SHA1FromIS = getSHA1FromIS(str);

System.out.println("SHA1 from String is: " + SHA1FromString.toUpperCase());
System.out.println("SHA1 from InputStream is: " + SHA1FromIS.toUpperCase());

}

public static String getSHA1FromString(String str) throws Exception {
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
sha1.update(str.getBytes());
byte[] digest = sha1.digest();
return byteArrayToHexString(digest);
}

public static String getSHA1FromIS(String str) throws Exception{

MessageDigest sha1 = MessageDigest.getInstance("SHA1");

InputStream is = new ByteArrayInputStream(str.getBytes());
BufferedInputStream bis = new BufferedInputStream(is);
DigestInputStream dis = new DigestInputStream(bis, sha1);

while (dis.read() != -1);
byte[] digest = sha1.digest();
return byteArrayToHexString(digest);
}

public static String byteArrayToHexString(byte[] b) {
String result = "";
for (int i=0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}

}

上面的代码将输出以下内容:

SHA1 from String is: 825CA9AF2795F3CCD41EC3B756CC7514E490842F
SHA1 from InputStream is: 825CA9AF2795F3CCD41EC3B756CC7514E490842F
<小时/>

问题:

  • 我正在使用相同的 String在这两种情况下都进行加密( VBSJava )。

  • 当我执行VBS时代码我得到这个SHA1来自 CAPICOM 的哈希值:

    636D0172D7FAC85AF9DB57FAE6C7D98B17DE5159

  • 当我执行Java时代码我得到这个SHA1哈希值:

    825CA9AF2795F3CCD41EC3B756CC7514E490842F

  • 我永远不会得到同样的base64 StringencryptedStr如果SHA1哈希不一样。

<小时/>

我的问题:

我做错了什么以及为什么 SHA1在这两种情况下,哈希值的计算方式不同。有人可以解释一下发生了什么或者实现此目的的正确方法是什么并在 Java 中获得相同的结果吗? ?

只是想知道,我发现这个链接有一点帮助,并说他们可以获得相同的 hash但没有解决我的情况的问题:

http://us.generation-nt.com/answer/capicom-hasheddata-java-binary-files-help-44910362.html?page=2

如果有人想安装CAPICOM并测试VBS代码,您可以执行以下操作:

  1. Copy "capicom.dll" to "C:\WINDOWS\system32"
  2. Click on Start/Programs/Accessories/Command Prompt
  3. Type "C:"
  4. Type "cd C:\WINDOWS\system32"
  5. Type "regsvr32.exe capicom.dll"
  6. Click on the "OK" button.
  7. Type "exit"

并下载 capicom.dll直接来自Microsoft在:

http://www.microsoft.com/downloads/details.aspx?FamilyID=860EE43A-A843-462F-ABB5-FF88EA5896F6&displaylang=en

最佳答案

已解决:

表达String的正确方法是使用以下方式:

String str = "Content-Type: plain/text; name=\"C:\\Users\\Luigi\\Desktop\\hello.txt\"" + "\r\n" +
"Content-Disposition: attachment; filename=\"C:\\Users\\Luigi\\Desktop\\hello.txt\"" + "\r\n" +
"test";

我们需要使用 \r\n 而不是 \n,那么 SHA1 哈希值将是相同的。

感谢 Ansgar Wiechers 揭露这一点。

关于java - Capicom SHA1 哈希值在 Java 中的计算方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16593997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com