証明書を使用して文字列に署名する Java アプリケーションがあります。文字列をSHA1で暗号化して動作します。コードを Delphi 2010 に変換しようとしていますが、Java アプリと同じように (sha1 を使用して) 動作させる方法がわかりません。これまでのところ、私はこれを見つけました:
Delphi 7 アクセス Windows X509 証明書ストア
動作しますが、sha1 を使用せず、Java アプリを実行すると異なる結果が得られます。
Java コード
char[] pass = (char[]) null;
PrivateKey key = (PrivateKey) getKeyStore().getKey(alias, pass);
Certificate[] chain = getKeyStore().getCertificateChain(alias);
CertStore certsAndCRLs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)), "BC");
X509Certificate cert = (X509Certificate) chain[0];
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSigner(key, cert, CMSSignedDataGenerator.DIGEST_SHA1);
gen.addCertificatesAndCRLs(certsAndCRLs);
CMSProcessable data = new CMSProcessableByteArray(conteudoParaAssinar);
CMSSignedData signed = gen.generate(data, true, "SunMSCAPI");
byte[] envHex = signed.getEncoded();
CertInfo certInfo = new CertInfo();
certInfo.Hash = new BigInteger(envHex).toString(16);
return certInfo;
Delphi コード
var
lSigner: TSigner;
lSignedData: TSignedData;
fs: TFileStream;
qt: integer;
ch: PChar;
msg : WideString;
content : string;
cert: TCertificate;
begin
cert := Self.GetCert;
content := 'test';
lSigner := TSigner.Create(self);
lSigner.Certificate := cert.DefaultInterface;
lSignedData := TSignedData.Create(self);
lSignedData.content := content;
msg := lSignedData.Sign(lSigner.DefaultInterface, false, CAPICOM_ENCODE_BASE64);
lSignedData.Free;
lSigner.Free;
編集
Javaコードに基づいて、証明書情報をバイナリ形式で取得し、sha1を適用して16進数に変換する必要がありますか? これは正しい順序であり、Java コードと同じことですか? capicom tlb とハッシュ クラスにいくつかの SHA1 定数が表示されます。これらのクラスを使用する必要があるかもしれませんが、方法がわかりません。