gpt4 book ai didi

c# - 使用 C sharp 中的 RSA 对 128 字节的字节数组进行签名

转载 作者:行者123 更新时间:2023-11-30 14:02:17 25 4
gpt4 key购买 nike

我对密码学完全陌生,我需要使用我用 C sharp 生成的 RSA key 对一个 128 字节的字节数组进行签名。 key 必须是 1024 位。

我找到了几个如何将 RSA 与 C sharp 结合使用的示例,我目前正在尝试使用的代码是:

public static void AssignParameter()
{
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "SpiderContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
rsa = new RSACryptoServiceProvider(cspParams);
rsa.KeySize = 1024;
}

public static string EncryptData(string data2Encrypt)
{
AssignParameter();
StreamReader reader = new StreamReader(path + "publickey.xml");
string publicOnlyKeyXML = reader.ReadToEnd();
rsa.FromXmlString(publicOnlyKeyXML);
reader.Close();

//read plaintext, encrypt it to ciphertext

byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt);
byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
return Convert.ToBase64String(cipherbytes);
}

此代码适用于小字符串(因此是短字节数组),但是当我尝试使用 128 个字符的字符串时,我收到一条错误消息:CryptographicException 未处理:长度错误(好吧,它可能不会准确地说“错误的长度”,我得到了丹麦语的错误,那就是“Forkert længde”,直接翻译为“错误的长度”)。

谁能告诉我如何使用 1024 位 C sharp 的 RSA key 加密 128 字节的字节数组?

提前致谢,主耶稣

编辑:

好吧,只是为了澄清一下:我有一条消息,我从中使用 SHA-256 进行哈希计算。这给出了一个 32 字节的数组。该数组使用自定义填充进行填充,因此它最终成为一个 128 字节的数组。然后应该用我的私钥签名这个填充的散列,这样接收方就可以使用我的公钥来验证收到的消息与发送的消息相同。这可以用 1024 位的 key 来完成吗?

最佳答案

如果您想签名,您不想加密。签名和加密是不同的算法。有一个著名的签名算法称为 RSA,还有一个著名的非对称加密算法也称为 RSA,并且签名算法最初(现在在许多地方仍然存在)是作为“你用私钥”。这简直令人困惑。

在 RSA 加密中,要加密的数据(使用公钥)必须用 PKCS#1 填充(RSA 标准)描述为“类型 2 填充”,然后通过 RSA 核心的模幂运算处理结果(其长度与模数相同)(在核心,但 RSA 不是 < em>仅模幂;填充对于安全性非常重要)。

签名时,要签名的数据必须经过哈希处理,然后将哈希值嵌入描述刚刚使用的哈希函数的结构中,编码结构本身用“Type 1 padding”填充——不是与加密填充相同的填充,这也很重要。

无论哪种方式,普通的 RSA 引擎都会自行执行类型 1 或类型 2 填充,并且大多数 RSA signature 引擎也会自行处理标识所用哈希函数的结构。诸如 RSACryptoServiceProvider 之类的 RSA 签名引擎可以与 SignHash() 一起使用,它需要哈希值(从 SHA-256 获得的 32 字节,没有 任何类型的封装结构或类型 1 填充——RSACryptoServiceProvider 自行处理),或 SignData(),它希望对数据进行签名(然后引擎会执行哈希计算也是如此)。

总而言之,如果您自己进行任何类型的填充,那么您就做错了。如果您使用 Encrypt() 来计算签名,那么您也做错了。

关于c# - 使用 C sharp 中的 RSA 对 128 字节的字节数组进行签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6299460/

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