一部の を暗号化するためにロジックを使用してCAPICOMアセンブリを使用していますが、これはうまく機能しますが、 を使用して同じものを複製しようとすると問題が発生します。VBStextJava
これは私の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 を表すオブジェクトがあるため)。StringInputStreamVBSstmStreamいくつかの
HexToBinaryメソッドを使用します (デフォルトではこのメソッドは に存在しないため、これを実装しますJava)。ハッシュから
BASE64Encoderのバイナリに使用します。StringSHA1最後に、
Leftメソッド fromorg.apache.commons.lang.StringUtils(VBSコードの複製) を使用してから、 として出力encryptedStrしbase64Stringます。
これは、少なくともハッシュを生成するために 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
ハッシュが同じでない
base64String場合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。