热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:使用RSACryptoServiceProvider进行公钥加密分享

使用RSACryptoServiceProvider进行公钥加密我已经在CodeProject上发表了一篇文章,解释了如何使用RSA提供程序进行加密和解密:RSA私钥加密虽然200

使用RSACryptoServiceProvider进行公钥加密

我已经在CodeProject上发表了一篇文章,解释了如何使用RSA提供程序进行加密和解密:

RSA私钥加密

虽然2009年的旧版本是错误的,但新的2012版本(具有System.Numerics.BigInteger支持)似乎更可靠。 这个版本缺少的是一种使用公钥加密并使用私钥 解密的方法。

所以,我自己尝试了,但是当我解密时会得到垃圾。 我不熟悉RSA提供商,所以我在这里很黑暗。 很难找到关于它应该如何工作的更多信息。

有谁看到这有什么问题? 以下是带有PUBLIC密钥的ENcryption:

// Add 4 byte padding to the data, and convert to BigInteger struct BigInteger numData = GetBig( AddPadding( data ) ); RSAParameters rsaParams = rsa.ExportParameters( false ); //BigInteger D = GetBig( rsaParams.D ); //only for private key BigInteger ExpOnent= GetBig( rsaParams.Exponent ); BigInteger Modulus = GetBig( rsaParams.Modulus ); BigInteger encData = BigInteger.ModPow( numData, Exponent, Modulus ); return encData.ToByteArray(); 

当我这样做时,我是否使用提供商提供的大“D”? 可能不是因为它是没有“D”的公钥。

然后是对应的(使用PRIVATE键进行DEcrypting):

 BigInteger numEncData = new BigInteger( cipherData ); RSAParameters rsaParams = rsa.ExportParameters( true ); BigInteger D = GetBig( rsaParams.D ); //BigInteger ExpOnent= GetBig( rsaParams.Exponent ); BigInteger Modulus = GetBig( rsaParams.Modulus ); BigInteger decData = BigInteger.ModPow( numEncData, D, Modulus ); byte[] data = decData.ToByteArray(); byte[] result = new byte[ data.Length - 1 ]; Array.Copy( data, result, result.Length ); result = RemovePadding( result ); Array.Reverse( result ); return result; 

我需要“D”或指数吗?

显然,我需要加密来兼顾私人 – 公共 – 私人。 任何帮助深表感谢!

这是一个例子:

  public static void rsaPlayground() { byte[] data = new byte[] { 1, 2, 3, 4, 5 }; RSACryptoServiceProvider csp = new RSACryptoServiceProvider();//make a new csp with a new keypair var pub_key = csp.ExportParameters(false); // export public key var priv_key = csp.ExportParameters(true); // export private key var encData = csp.Encrypt(data, false); // encrypt with PKCS#1_V1.5 Padding var decBytes = MyRSAImpl.plainDecryptPriv(encData, priv_key); //decrypt with own BigInteger based implementation var decData = decBytes.SkipWhile(x => x != 0).Skip(1).ToArray();//strip PKCS#1_V1.5 padding } public class MyRSAImpl { private static byte[] rsaOperation(byte[] data, BigInteger exp, BigInteger mod) { BigInteger bData = new BigInteger( data //our data block .Reverse() //BigInteger has another byte order .Concat(new byte[] { 0 }) // append 0 so we are allways handling positive numbers .ToArray() // constructor wants an array ); return BigInteger.ModPow(bData, exp, mod) // the RSA operation itself .ToByteArray() //make bytes from BigInteger .Reverse() // back to "normal" byte order .ToArray(); // return as byte array /* * * A few words on Padding: * * you will want to strip padding after decryption or apply before encryption * */ } public static byte[] plainEncryptPriv(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.privExponent, myKey.Modulus); } public static byte[] plainEncryptPub(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.pubExponent, myKey.Modulus); } public static byte[] plainDecryptPriv(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.privExponent, myKey.Modulus); } public static byte[] plainDecryptPub(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.pubExponent, myKey.Modulus); } } public class MyRSAParams { public static MyRSAParams fromRSAParameters(RSAParameters key) { var ret = new MyRSAParams(); ret.Modulus = new BigInteger(key.Modulus.Reverse().Concat(new byte[] { 0 }).ToArray()); ret.privExpOnent= new BigInteger(key.D.Reverse().Concat(new byte[] { 0 }).ToArray()); ret.pubExpOnent= new BigInteger(key.Exponent.Reverse().Concat(new byte[] { 0 }).ToArray()); return ret; } public BigInteger Modulus; public BigInteger privExponent; public BigInteger pubExponent; } 

以此编码/解码示例为例

上述就是C#学习教程:使用RSACryptoServiceProvider进行公钥加密分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记

  byte[] toEncryptData = Encoding.ASCII.GetBytes("hello world"); //Generate keys RSACryptoServiceProvider rsaGenKeys = new RSACryptoServiceProvider(); string privateXml = rsaGenKeys.ToXmlString(true); string publicXml = rsaGenKeys.ToXmlString(false); //Encode with public key RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider(); rsaPublic.FromXmlString(publicXml); byte[] encryptedRSA = rsaPublic.Encrypt(toEncryptData, false); string EncryptedResult = Encoding.Default.GetString(encryptedRSA); //Decode with private key var rsaPrivate = new RSACryptoServiceProvider(); rsaPrivate.FromXmlString(privateXml); byte[] decryptedRSA = rsaPrivate.Decrypt(encryptedRSA, false); string originalResult = Encoding.Default.GetString(decryptedRSA); 


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍如何使用Samba软件配置CIFS文件共享服务,涵盖安装、配置、权限管理及多用户挂载等关键步骤。通过具体示例和命令行操作,帮助读者快速搭建并优化Samba服务器。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
author-avatar
闻汝婕环境_259
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有