第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用RSA和SHA256和.NET簽署文件?

如何使用RSA和SHA256和.NET簽署文件?

哆啦的時(shí)光機(jī) 2019-10-28 10:31:11
我的應(yīng)用程序?qū)@取一組文件并對(duì)其進(jìn)行簽名。(我不是要對(duì)程序集進(jìn)行簽名。)我從中獲取了一個(gè).p12文件,該文件是私鑰。這是我嘗試使用的代碼,但是得到了System.Security.Cryptography.CryptographicException "Invalid algorithm specified."。X509Certificate pXCert = new X509Certificate2(@"keyStore.p12", "password");RSACryptoServiceProvider csp = (RSACryptoServiceProvider)pXCert.PrivateKey;string id = CryptoConfig.MapNameToOID("SHA256");return csp.SignData(File.ReadAllBytes(filePath), id);根據(jù)這個(gè)答案,這是不可能的(RSACryptoServiceProvider它不支持SHA-256),但是我希望可以使用不同的庫(例如Bouncy Castle)來實(shí)現(xiàn)。我是新手,發(fā)現(xiàn)Bouncy Castle非常令人困惑。我正在將Java應(yīng)用程序移植到C#,并且必須使用相同類型的加密來對(duì)文件進(jìn)行簽名,因此我陷入了RSA + SHA256的困境。如何使用Bouncy Castle,OpenSSL.NET,Security.Cryptography或我未曾聽說的其他第三方庫來執(zhí)行此操作?我假設(shè),如果可以用Java完成,那么可以用C#完成。更新:這是我從Poupou的anwser中的鏈接得到的        X509Certificate2 cert = new X509Certificate2(KeyStoreFile, password");        RSACryptoServiceProvider rsacsp = (RSACryptoServiceProvider)cert.PrivateKey;        CspParameters cspParam = new CspParameters();        cspParam.KeyContainerName = rsacsp.CspKeyContainerInfo.KeyContainerName;        cspParam.KeyNumber = rsacsp.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2;        RSACryptoServiceProvider aescsp = new RSACryptoServiceProvider(cspParam);        aescsp.PersistKeyInCsp = false;        byte[] signed = aescsp.SignData(File.ReadAllBytes(file), "SHA256");        bool isValid = aescsp.VerifyData(File.ReadAllBytes(file), "SHA256", signed);問題是我無法獲得與原始工具相同的結(jié)果。據(jù)我從閱讀代碼中得知,進(jìn)行實(shí)際簽名的CryptoServiceProvider沒有使用密鑰存儲(chǔ)文件中的PrivateKey。那是對(duì)的嗎?
查看完整描述

3 回答

?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊

RSA + SHA256可以并且將...


您后面的示例可能并非始終有效,它應(yīng)使用哈希算法的OID,而不是名稱。根據(jù)你的第一個(gè)例子,這是從調(diào)用獲得的CryptoConfig.MapNameToOID(AlgorithmName),其中AlgorithmName是您所提供的(即“SHA256”)。


首先,您需要的是帶有私鑰的證書。我通常通過使用公共密鑰文件(.cer)來識(shí)別私鑰,從LocalMachine或CurrentUser存儲(chǔ)中讀取我的私鑰,然后枚舉證書并在哈希上進(jìn)行匹配...


X509Certificate2 publicCert = new X509Certificate2(@"C:\mycertificate.cer");


//Fetch private key from the local machine store

X509Certificate2 privateCert = null;

X509Store store = new X509Store(StoreLocation.LocalMachine);

store.Open(OpenFlags.ReadOnly);

foreach( X509Certificate2 cert in store.Certificates)

{

    if (cert.GetCertHashString() == publicCert.GetCertHashString())

        privateCert = cert;

}

無論您到達(dá)那里,一旦獲得帶有私鑰的證書,我們都需要對(duì)其進(jìn)行重建。由于證書創(chuàng)建它的私鑰的方式可能是必需的,但我不確定為什么。無論如何,我們首先導(dǎo)出密鑰,然后使用您喜歡的任何中間格式重新導(dǎo)入密鑰,最簡(jiǎn)單的是xml:


//Round-trip the key to XML and back, there might be a better way but this works

RSACryptoServiceProvider key = new RSACryptoServiceProvider();

key.FromXmlString(privateCert.PrivateKey.ToXmlString(true));

一旦完成,我們現(xiàn)在可以如下簽名數(shù)據(jù):


//Create some data to sign

byte[] data = new byte[1024];


//Sign the data

byte[] sig = key.SignData(data, CryptoConfig.MapNameToOID("SHA256"));

最后,可以直接使用證書的公鑰進(jìn)行驗(yàn)證,而無需像使用私鑰那樣進(jìn)行重建:


key = (RSACryptoServiceProvider)publicCert.PublicKey.Key;

if (!key.VerifyData(data, CryptoConfig.MapNameToOID("SHA256"), sig))

    throw new CryptographicException();


查看完整回答
反對(duì) 回復(fù) 2019-10-28
  • 3 回答
  • 0 關(guān)注
  • 583 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)