我正在使用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
我试图复制相同的内容时,我认为这可以通过......
获取or
SHA1
的散列(因为在代码中有一个代表 a 的对象)。String
InputStream
VBS
stm
Stream
使用一些
HexToBinary
方法(通过实现这个,因为默认情况下这个方法在 中不存在Java
)。用于哈希
BASE64Encoder
的二进制文件String
。SHA1
最后,使用
Left
方法 fromorg.apache.commons.lang.StringUtils
(复制VBS
代码),然后输出encryptedStr
为base64
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
在两种情况下都使用相同的加密(VBS
和Java
)。当我执行
VBS
代码时,我SHA1
从以下位置获取此哈希值CAPICOM
:636D0172D7FAC85AF9DB57FAE6C7D98B17DE5159
当我执行
Java
代码时,我得到了这个SHA1
哈希值:825CA9AF2795F3CCD41EC3B756CC7514E490842F
如果哈希不一样
base64
String
,我永远不会得到相同的结果。encryptedStr
SHA1
我的问题:
我做错了什么以及为什么SHA1
哈希在两种情况下的计算方式都不同。有人可以解释正在发生的事情或实现这一点并获得相同结果的正确方法是什么Java
吗?
只是要知道,我发现这个链接有点帮助,并说他们可以得到相同的结果hash
,但不能解决我的问题:
http://us.generation-nt.com/answer/capicom-hasheddata-java-binary-files-help-44910362.html?page=2
如果有人想安装CAPICOM
和测试VBS
代码,您可以执行以下操作:
- 将“capicom.dll”复制到“C:\WINDOWS\system32”
- 单击开始/程序/附件/命令提示符
- 键入“C:”
- 键入“cd C:\WINDOWS\system32”
- 键入“regsvr32.exe capicom.dll”
- 单击“确定”按钮。
- 输入“退出”
capicom.dll
并直接从以下位置下载自己Microsoft
: