c# - 来自硬件的 Tripledes
问题描述
using System;
using System.Security.Cryptography;
namespace SmartCardSign
{
class SCSign
{
static void Main(string[] args)
{
// To idendify the Smart Card CryptoGraphic Providers on your
// computer, use the Microsoft Registry Editor (Regedit.exe).
// The available Smart Card CryptoGraphic Providers are listed
// in HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\Defaults\Provider.
// Create a new CspParameters object that identifies a
// Smart Card CryptoGraphic Provider.
// The 1st parameter comes from HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\Defaults\Provider Types.
// The 2nd parameter comes from HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\Defaults\Provider.
CspParameters csp = new CspParameters(1, "Schlumberger Cryptographic Service Provider");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer;
// Initialize an RSACryptoServiceProvider object using
// the CspParameters object.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
// Create some data to sign.
byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine("Data : " + BitConverter.ToString(data));
// Sign the data using the Smart Card CryptoGraphic Provider.
byte[] sig = rsa.SignData(data, "SHA1");
Console.WriteLine("Signature : " + BitConverter.ToString(sig));
// Verify the data using the Smart Card CryptoGraphic Provider.
bool verified = rsa.VerifyData(data, "SHA1", sig);
Console.WriteLine("Verified : " + verified);
}
}
}
是否可以用三元组实现相同的功能?我试过但找不到解决方案。
链接:https ://docs.microsoft.com/en-us/dotnet/standard/security/how-to-access-hardware-encryption-devices
解决方案
一般你不能。原因相对简单:对称密码(例如三重 DES)对于个人对个人密码学(例如签名生成(或对称算法的 MAC)或加密)不是很有用。
非对称密码的优点是您可以将加密密钥分发给其他人。为此,其他人需要确定他们收到了正确的密钥:密钥需要被信任。为此,需要设置公钥基础设施或 PKI。已知的 PKI 是基于 X.509 证书的 PGP 和 PKIX - 与用于 HTTPS 连接的相同。
因此,只有当其他实体可以使用相同的密钥时,智能卡上的三重 DES 才有意义。这只是为了获得微小的性能提升,因为您也可以使用公钥进行加密,即使在软件中也是如此。然后您可以使用卡上的私钥解密。通常使用混合密码系统,其中使用 RSA 建立对称密钥(例如三重 DES 密钥),然后使用该密钥对消息进行加密。
这并不是说不可能——我实际上设计了一个兼容 PKCS#11 的智能卡,但是大多数 PKCS#11 和 CSP 的实现不支持 3DES,然后你需要一个兼容的智能卡和 3DES 密钥也是。另请参阅BartonJS 的答案。
推荐阅读
- r - 如何根据各种标准提取 r 中的列
- xml - 带有逗号分隔文本的元素的 XML XPath
- javascript - 为 React 应用程序存储获取的数据的常用方法?
- angular - ag-grid(this.gridOptions.api.exportDataAsExcel 面临问题)
- gradle - 如何使用 Gradle 基于配置文件构建 Quarkus 容器?
- spring-boot - Spring Boot:打包maven项目多模块
- java - 将多个 gradle zip 任务组合成一个
- java - 如何从 nfc 标签中读取多个有效负载并将有效负载存储到数组列表中?
- apache-spark - 安装 2.3 版 pyspark 的问题
- ruby - 救援,但仍然记录哨兵/新遗物通知/日志记录错误