c# – .NET中最小的邮件大小公钥加密

c# – .NET中最小的邮件大小公钥加密,第1张

概述我想使用公共密钥加密系统将很少的数据(15个字节精确地)加密到尽可能短的位置(最佳不超过16个字节)的消息. 标准的公共密钥系统RSA不幸地生成与其密钥一样大的消息,大约是100字节,这取决于密钥大小. 为了使事情更加困难,我只能使用.NET框架库,即没有第三方. 我已经在维基百科上看过一些关于椭圆曲线密码术的文章,并且文本似乎表明,键的大小通常比RSA密钥短得多. 这是否也转化为短信?可以使用. 我想使用公共密钥加密系统将很少的数据(15个字节精确地)加密到尽可能短的位置(最佳不超过16个字节)的消息.

标准的公共密钥系统RSA不幸地生成与其密钥一样大的消息,大约是100字节,这取决于密钥大小.
为了使事情更加困难,我只能使用.NET框架库,即没有第三方.

我已经在维基百科上看过一些关于椭圆曲线密码术的文章,并且文本似乎表明,键的大小通常比RSA密钥短得多.

这是否也转化为短信?可以使用.NET ECDiffIEHellmanCng类来消息/加密吗?它似乎具有不同的类结构,然后就是说,RSA或对称密码.

解决方法 您可以使用ECDiffIEHellman加密消息.您有两个选项:静态ECDH和静态临时ECDH:

对于静态ECDH,接收方将需要知道发送者的公钥(这可能是或可能不是应用程序中的一个选项).你也应该有一些这个消息是唯一的数据(它可能是你从协议或数据库行中的其他地方获得的序列号,或者它或者是一个随机数).然后,您可以使用ECDH生成密钥,并使用它来加密数据.这将为您提供所需的16个字节的加密数据长度,但并不完全非对称:加密器还能够解密消息(再次:这可能或可能不是应用程序中的问题).

静态短暂有点不同:加密器生成一个临时(短暂的)EC关键字.然后他将这个密钥对与接收器公钥一起使用,以生成可用于加密数据的秘密密钥.最后他将短信关键字的公钥与加密数据一起发送给接收者.这可能更适合您的应用程序,但完整的加密数据现在将使用ECDH-256和AES为2 * 32 16 = 80字节(如GregS注释,只能发送公钥的x坐标可以节省32个字节,但我不相信.NET公开了重新计算y坐标的功能).

这是一个小型的静态静态ECDH:

public static class StaticStaticDiffIEHellman{  private static Aes DeriveKeyAndiv(ECDiffIEHellmanCng privateKey,ECDiffIEHellmanPublicKey publicKey,byte[] nonce)  {    privateKey.KeyDerivationFunction = ECDiffIEHellmanKeyDerivationFunction.Hash;    privateKey.HashAlgorithm = Cngalgorithm.Sha256;    privateKey.SecretAppend = nonce;    byte[] keyAndiv = privateKey.DeriveKeyMaterial(publicKey);    byte[] key = new byte[16];    Array.copy(keyAndiv,key,16);    byte[] iv = new byte[16];    Array.copy(keyAndiv,16,iv,16);    Aes aes = new AesManaged();    aes.Key = key;    aes.IV = iv;    aes.Mode = CipherMode.CBC;    aes.padding = paddingMode.PKCS7;    return aes;  }  public static byte[] Encrypt(ECDiffIEHellmanCng privateKey,byte[] nonce,byte[] data){    Aes aes = DeriveKeyAndiv(privateKey,publicKey,nonce);    return aes.CreateEncryptor().transformFinalBlock(data,data.Length);  }  public static byte[] Decrypt(ECDiffIEHellmanCng privateKey,byte[] encryptedData){    Aes aes = DeriveKeyAndiv(privateKey,nonce);    return aes.CreateDecryptor().transformFinalBlock(encryptedData,encryptedData.Length);  }}// Usage:ECDiffIEHellmanCng key1 = new ECDiffIEHellmanCng();    ECDiffIEHellmanCng key2 = new ECDiffIEHellmanCng();byte[] data = EnCoding.UTF8.GetBytes("TestTestTestTes");byte[] nonce = EnCoding.UTF8.GetBytes("whatever");byte[] encryptedData = StaticStaticDiffIEHellman.Encrypt(key1,key2.PublicKey,nonce,data);Console.Writeline(encryptedData.Length); // 16byte[] decryptedData = StaticStaticDiffIEHellman.Decrypt(key2,key1.PublicKey,encryptedData);Console.Writeline(EnCoding.UTF8.GetString(decryptedData));
总结

以上是内存溢出为你收集整理的c# – .NET中最小的邮件大小公钥加密全部内容,希望文章能够帮你解决c# – .NET中最小的邮件大小公钥加密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存