58

メッセージを暗号化および復号化するための x509 証明書を作成すると、いくつかのエラー情報が表示され、この問題を修正できませんでした。誰かがこのバグを解決する可能性はありますか? ありがとう。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細:

System.Security.Cryptography.CryptographicException: キーセットが存在しません。</p>

ソース エラー:

53 行目: (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.Key) を使用 54 行目:
{ 55 行目: plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false); 行 56:
rsaProviderDecrypt.Clear(); 行 57:
rsaProviderDecrypt.Dispose();

ソース ファイル: E:\PayUSite\PayMvcApp\Controllers\HashMessageController.cs 行: 55

スタックトレース:

[CryptographicException: キーセットが存在しません。]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +41
System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte[] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey) +0
System.Security.Cryptography .RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP) +579

ソースコード:

string docFile = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash = HashAlgorithm.Create("SHA1");
byte[] hashedBytes;
using (FileStream fs = new FileStream(docFile, FileMode.Open))
{
    //compute message hash value
    hashedBytes = hash.ComputeHash(fs);
    hash.Dispose();
    fs.Close();
}
    
string hashedString = Convert.ToBase64String(hashedBytes);
    
//encrypt message digest
string priKeyFile = Server.MapPath("~/certificate/WosMiddle.pfx");
X509Certificate2 certEncrypt = new X509Certificate2(priKeyFile, "123456");
byte[] encryptedHashBytes;
using (RSACryptoServiceProvider rsaProviderEncrypt = (RSACryptoServiceProvider)certEncrypt.PrivateKey)
{
    encryptedHashBytes = rsaProviderEncrypt.Encrypt(hashedBytes, false);
    rsaProviderEncrypt.Dispose();
}
    
//decrypt message digest
string pubKeyFile = Server.MapPath("~/certificate/WosMiddle-pubkey.cer");
X509Certificate2 cerDecrypt = new X509Certificate2(pubKeyFile);
byte[] plainHashBytes;
using (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.Key)
{
    //***will throw error message here...***
    plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false);
    rsaProviderDecrypt.Dispose();
}
    
//verify message whether was modified
string docFile2 = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash2 = HashAlgorithm.Create("SHA1");
byte[] hashedBytes2;
using (FileStream fs2 = new FileStream(docFile2, FileMode.Open))
{
    //compute message hash value
    hashedBytes2 = hash.ComputeHash(fs2);
    fs2.Close();
}
    
//compare hash value
bool isEqual = plainHashBytes.SequenceEqual(hashedBytes2);
4

9 に答える 9

8

アプリケーションが次のフォルダー パスに書き込もうとしている可能性があります: C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

アプリケーションが偽装を使用しているか、IUSR_MACHINENAME ユーザーを使用している場合は、MachineKeys フォルダーのセキュリティを構成し、ユーザーに読み取りと実行、フォルダーの内容の一覧表示、読み取り、書き込みを許可します。それでもうまくいかない場合は、Everyone ユーザーに同じ権限を付与してみてください。

于 2012-08-24T09:44:55.813 に答える
4

暗号化と復号化を使用する場合、暗号化には公開鍵が、復号化には秘密鍵が必要だと思います。したがって、秘密鍵なしで復号化しようとしていて、例外が発生するため、失敗しています。

実際に は、署名を作成するためにSignDataメソッドを使用し、検証のためにVerifyDataを使用する必要があります。

于 2012-08-24T10:28:30.743 に答える