1

一部の を暗号化するためにロジックを使用して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私は同じことを複製しようとしていますが、これは次の方法で実行できると思います...

  1. orSHA1のハッシュを取得します(コードにはa を表すオブジェクトがあるため)。StringInputStreamVBSstmStream

  2. いくつかのHexToBinaryメソッドを使用します (デフォルトではこのメソッドは に存在しないため、これを実装しますJava)。

  3. ハッシュからBASE64Encoderのバイナリに使用します。StringSHA1

  4. 最後に、Leftメソッド from 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 String場合encryptedStrと同じになることはありません。SHA1


私の質問:

私が間違っていることとSHA1、両方のケースでハッシュが異なって計算されるのはなぜですか。誰かが何が起こっているのか、またはこれを実装して同じ結果を得る正しい方法は何かを説明できますかJava?

知っておくと、少し役立つこのリンクが見つかりました。同じものを得ることができますが、hash私の場合の問題は解決しません。

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

誰かがコードをインストールCAPICOMしてテストしたい場合VBSは、次のことができます。

  1. 「capicom.dll」を「C:\WINDOWS\system32」にコピーします
  2. スタート/プログラム/アクセサリ/コマンド プロンプトをクリックします。
  3. 「C:」と入力
  4. 「cd C:\WINDOWS\system32」と入力します
  5. 「regsvr32.exe capicom.dll」と入力します
  6. 「OK」ボタンをクリックします。
  7. 「出口」と入力

そして、次のcapicom.dll場所から自分自身を直接ダウンロードしますMicrosoft

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

4

1 に答える 1