1

X.509 証明書によって提供される公開鍵を使用して、RSA で何かを暗号化する必要があります。証明書は正常です (Windows エクスプローラーで確認すると、公開鍵、RSA 20148 ビットが表示されます)。

公開鍵をインポートする最初の基本的なステップを実行しようとすると失敗します - タグ付けされたソース行で EOSError 例外「ASN1 tag bad value」が発生します (Win32Check によってスローされます)。これを解決するにはどうすればよいですか?

私は使っている:

  • Rudy Velthuis による WinCrypt (最終更新日 2008 年 3 月 7 日)
  • デルファイ(XE2)

ソースコード:

try
CertPath := 'c:\somefolder\data';
pubCert := TFileStream.Create(CertPath + '\zpr_prod_public_cert.cer', fmOpenRead or fmShareDenyNone);
try
  SetLength(Buffer, pubCert.Size);
  BufLen := pubCert.read(Pointer(Buffer)^, pubCert.Size);
finally
  pubCert.Free;
end;
except
  RaiseLastOSError;
  Exit;
end;
if Length(Buffer) > 1 then
begin
try
  DataLen := 0;
  // !!! the following line should actually do the trick, but it doesn't...
  // Certcontext remains empty and the errormessage is "ASN1 tag bad value met"
  CertContext := CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, @Buffer[0], BufLen);
  if CertContext = nil then // Then I'll try another way which results in the same error :(
     Win32Check(CryptDecodeObjectEx(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, X509_PUBLIC_KEY_INFO, @Buffer[0], BufLen, CRYPT_ENCODE_ALLOC_FLAG, nil, @PublicKeyInfo, DataLen))
  else
  begin // this is actually never reached...so may be ignored
    hCProv := __CryptAcquireContext(PROV_RSA_FULL);
    if Win32Check(CryptImportPublicKeyInfo(hCProv, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, @certcontext.pCertInfo.SubjectPublicKeyInfo, hKey)) then
    begin
      DataLen := Length(einKey);
      BufLen := DataLen;
      Win32Check(CryptEncrypt(hkey, 0, True, 0, @EinKey[0], DataLen, BufLen));
      SetLength(einKey, DataLen);
    end;
  end;
finally
  Win32Check(CryptReleaseContext(hCProv, 0));
end;
end; 
  1. 証明書ファイルを正しく読み取っていますか? 他のものを使用する必要がありますか?
  2. API メソッドを正しく使用していますか?
  3. このエラー (「ASN1 タグの値が正しくありません」) の原因は何ですか?
4

0 に答える 0