gpt4 book ai didi

java - Capicom 和 SHA1 - 帮助将 Java 代码转换为 Delphi

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:17 25 4
gpt4 key购买 nike

我有一个使用证书对字符串进行签名的 Java 应用程序。它使用 SHA1 加密字符串。我正在尝试将代码转换为 Delphi 2010,但我不知道如何让它以与 java 应用程序相同的方式工作(使用 sha1)。到目前为止,我发现了这个:

Delphi 7 access Windows X509 Certificate Store

它确实有效,但它不使用 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;

德尔福代码

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 并将其转换为十六进制吗?这是正确的顺序和 java 代码所做的相同的事情吗?我可以在 capicom tlb 中看到一些 SHA1 常量以及一个哈希类,也许我应该使用这些类,但我不知道如何使用。

最佳答案

我们使用 DCPCrypt在一些与我们的 Java Tomcat 应用程序交互并能够获得 SHA-256 兼容哈希的 delphi 应用程序中。我怀疑 SHA1 也很简单。

举个例子

function Sha256FileStreamHash(fs : TFileStream): String;
var
Hash: TDCP_sha256;
Digest: array[0..31] of byte; // RipeMD-160 produces a 160bit digest (20bytes)
i: integer;
s: string;
begin
if fs <> nil then
begin
fs.Seek(0, soFromBeginning);
Hash:= TDCP_sha256.Create(nil); // create the hash
try
Hash.Init; // initialize it
Hash.UpdateStream(fs,fs.Size); // hash the stream contents
Hash.Final(Digest); // produce the digest
s:= '';
for i:= 0 to 31 do
s:= s + IntToHex(Digest[i],2);
Result:= s; // display the digest
finally
Hash.Free;
end;
end;
end;

关于java - Capicom 和 SHA1 - 帮助将 Java 代码转换为 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com