一部の を暗号化するためにロジックを使用して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」と入力します
- 「OK」ボタンをクリックします。
- 「出口」と入力
そして、次のcapicom.dll
場所から自分自身を直接ダウンロードしますMicrosoft
。