自适应网站设计案例,沈阳百度seo排名优化软件,广东电子商务网站建设价格,建设大型网站制作品牌差点造了一整个轮子.Net Framework 4.5 里面的RSA功能#xff0c;并未提供简单对PEM密钥格式的支持#xff08;.Net Core有咩#xff1f;#xff09;#xff0c;差点#xff08;还远着#xff09;造了一整个轮子#xff0c;就为了支持PEM PKCS#8、PKCS#1格式密钥对的导… 差点造了一整个轮子.Net Framework 4.5 里面的RSA功能并未提供简单对PEM密钥格式的支持.Net Core有咩差点还远着造了一整个轮子就为了支持PEM PKCS#8、PKCS#1格式密钥对的导入导出。Github: https://github.com/xiangyuecn/RSA-csharp本文内容来自README主要介绍了PEM PKCS#8、PKCS#1公钥和私钥格式并以此为基础写的C#函数方法。前言、自述、还有啥在写一个小转换工具时加入了RSA加密解密支持见图RSA工具秘钥输入框支持填写XML和PEM格式操作类型里面支持XML-PEM、PEM-XML的转换。实现相应功能发现原有RSA操作类不能良好工作PEM-XML没问题只要能通过PEM创建RSA就能用RSACryptoServiceProvider自带方法导出XML。但XML-PEM没有找到相应的简单实现方法大部分博客写的用BouncyCastle库来操作代码是少但BouncyCastle就有好几兆大小我的小工具啊才100K所以自己实现了一个支持导出PKCS#1、PKCS#8格式PEM密钥的方法RSA_PEM.ToPEM。操作过程中发现原有RSA操作类不支持用PKCS#8格式PEM密钥来创建RSA对象用的RSACryptoServiceProviderExtension的扩展方法来支持PEM密钥仅支持PKCS#1所以又自己实现了一个从PEM密钥来创建RSACryptoServiceProvider的方法RSA_PEM.FromPEM。在实现导入导出PEM密钥过程中对PKCS#1、PKCS#8格式的PEM密钥有了一定的了解主要参考了《RSA公钥文件PEM解析》公钥字节码分解。《RSA私钥文件PEM解析》私钥字节码分解。《iOS安全相关 - RSA中公钥的DER格式组成》1字节和2字节长度表述方法和为什么有些字段前面要加0x00。跑起来clone下来用vs应该能够直接打开经目测看起来没什么卵用的文件都svn:ignore掉了svn滑稽。主要支持通过XML格式密钥对创建RSA通过PEM格式密钥对创建RSARSA加密、解密RSA签名、验证导出XML格式公钥、私钥导出PEM格式公钥、私钥PEM格式秘钥对和XML格式秘钥对互转PEM密钥编码格式长度表述方法PEM格式中每段数据基本上都是flag长度数据占用位数长度数值数据这种格式。长度数据占用位数有0x81和0x82两个值分别代表长度数值占用了1字节和2字节。但长度数据占用位数不一定存在如果长度数值0x80时理由应该和下面这个加0x00一致长度数值直接在flag后面用1位来表述变成了flag长度数值(0x80)数据。什么情况下内容前面要加0x00如果内容的bit流的前4 bit十六进制值8就要在内容前面加0x00其他不用加。一个大整数最高位为符号位其为1时就是负数所以要在最高位填充0x00以保证不为负。PEM公钥编码格式PKCS#1、PKCS#8公钥编码都是统一的格式。/*****1024字节公钥*****/-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYw9M3REzDtYqwBrs/as/Oy8
GRE5OmnqOV0EfkEiCIjiczbVEFnZ3qRjLbDATfmBxNQ6c6Fga8nX28glEH/aL/RG2KdpI8KMUqKAszNydsHSeh9MSKcd5zgS4NuE0ueR7CB8kOWipiLDQmY38kpM36p
RWdNQlpIaTDo5IhJJwIDAQAB
-----END PUBLIC KEY-----/*****二进制表述*****/30819F300D06092A864886F70D010101050003818D003081890281810098C3DF8CDFE444CC3B58AB006BB3F6ACFCECBC1911393A69EA395D047E41220888E27336D51059D9DEA4632DB0C04DF981C4D43A73A1606BC9D7DBC825107FDA2FF446D8A76923C28C52A280B3337276C1D27A1F4C48A71DE73812E0DB84D2EF9E47B081F243968A988B0D0998DFC929337EA945674D425A486930E8E48849270203010001/*****二进制分解*****//*
后续到结尾内容长度为0x9F字节相当于整个文件长度-当前这4字节。
格式tag[长度数据占用位数(可选)]后续长度数值此处tag0x30长度数据占用1位参考前面长度表述方法后续长度数值0x9F个字节
*/30 81 9F/*
固定内容 encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA 1.2.840.113549.1.1.1其实不懂是啥玩意
*/30 0D 06092A864886F70D0101010500/*后续内容长度后面内容长度为0x8D字节和开头格式一致*/03 81 8D/*固定内容*/00/*后续内容长度后面内容长度为0x89字节和开头格式一致*/30 81 89/*
RSA Modulus内容
格式tag[长度数据占用位数(可选)]内容长度数值内容此处tag0x02所有RSA相关参数都是用02长度数据占用位数为1字节内容长度数值0x81个字节内容为0x00-0x27这一段参考前面什么情况下要加0x00。
*/02 81 810098C3DF8CDFE444CC3B58AB006BB3F6ACFCECBC1911393A69EA395D047E41220888E27336D51059D9DEA4632DB0C04DF981C4D43A73A1606BC9D7DBC825107FDA2FF446D8A76923C28C52A280B3337276C1D27A1F4C48A71DE73812E0DB84D2EF9E47B081F243968A988B0D0998DFC929337EA945674D425A486930E8E4884927/*RSA Exponent内容和Modulus一样但此处长度数据占用位数不存在*/02 03 010001PEM PKCS#1私钥编码格式/*****1024字节PKCS#1私钥*****/-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCYw9M3REzDtYqwBrs/as/Oy8GRE5OmnqOV0EfkEiCIjiczbV
EFnZ3qRjLbDATfmBxNQ6c6Fga8nX28glEH/aL/RG2KdpI8KMUqKAszNydsHSeh9M
SKcd5zgS4NuE0ueR7CB8kOWipiLDQmY38kpM36pRWdNQlpIaTDo5IhJJwIDAQAB
AoGAcGNSWRrynia1onf4lzg8v2U0QGEKV0vRNF0/HRCSN6MjkUDJxdDc0UYHZsk
uSXklTMQi/w70msacQNRqOsNk32O6vVPxr4NfTVaIV59Jv9Z5SXGiRmRZXeRw0ks
KYdOwaDJJu9zETNHZoMFJm8sq/tGJPQCPNesoZRZssL7mjkCQQDOI6jKt60bvu6V
XvtQoyUUbyMj9eCOBatS49jRvv326TMc951e9TcbnD0cxJrV1N6yIiejwfagb
eYfN61AkEAvbc8KTlBbI9TMwnVkQpstckgm3gpRDhAfQ/Lt7r8g2KAHsJvwb
AJCgu8PgqM9mQjVxZ78aLEQh5rvMV6wJAY1c9/ct8ihVZsqL1cgBHP2rFrO
x8KlqMGSKmhPD9v2XLfDScBUrX9oYKB17DJTXE6Lz/CaTs1K2BrEI4gzQJBAJIQ
s9chaAfHSc1v8uha2F23Ltrk8iLknfi9LrBNneedGPVJxbXoeNm0gKxQIXaXSCoN
r6TP0iH5eZa3NIjIS8UCQAbwd2WJIonvuUsKk2dtZTqZx8e53NreZUFMaIkoS5
JPJqI6/6hq8/2ARFO3P9/qkxDMkJv8mSjV91cZixB10
-----END RSA PRIVATE KEY-----/*****二进制表述*****/3082025C0201000281810098C3DF8CDFE444CC3B58AB006BB3F6ACFCECBC1911393A69EA395D047E41220888E27336D51059D9DEA4632DB0C04DF981C4D43A73A1606BC9D7DBC825107FDA2FF446D8A76923C28C52A280B3337276C1D27A1F4C48A71DE73812E0DB84D2EF9E47B081F243968A988B0D0998DFC929337EA945674D425A486930E8E48849270203010001028180706352591AF29E26BED689DFE25CE0F2FD94D10184295D2F44D174FC744248DE8C8E45032717437345181D9B24B925E49533108BFC3BD26B1A710351A8EB0D937D8EEAF54FC6BE0D7D355A215E7D26FF59E525C6891991657791C3492C29874EC1A0C926EF73113347668305266F2CABFB4624F4023CD7ACA19459B2C2FB9A39024100CE23A8CAB7AD1BBEEE955EFB50A325146F2323F5E08E05AB52E3D8D1BEFDF6E9331CF79D5EF5371B9C3D1CC49AD5D4DEB2222FBEF9E8F07DA81B7987FEF8DEB5024100BDB73C2939416C8F533309D5910A6CB7E724826DE0A510E101F43F2EDEEBF20D8A007B09BFEC1B0090A0BBC3E0A8CF6642357167EEFCF9A2C443E879AEF315EB024063573DFDCB7C8A157E66CFAA2F57200473F6AC5ACEC7C2A5A8C192F8A9A13C3F6FD972DF0D270152B5FDA18281D7B0C94D713A2F3FC2693B352B606B108E20CD0241009210B3D7216807C749CD6FF2E85AD85DB72EDAE4F222E49DF8BD2EB04D9DE79D18F549C5B5E878D9B480AC50217697482A0DAFA4CFD221F97996B73488C84BC5024006F0F9DD96248A27FAFB94B0A93676D653A99C7C7B9DCDADE65414C6889284B924F26A23AFFA86AF3FD804453B73FDFEA9310CC909BFC9928D5F757198B1075D/*****二进制分解大部分和公钥格式相同*****//*后续内容长度后面内容长度为0x025C个字节和公钥开头格式一致参考公钥部分*/30 82 025C/*固定版本号*/02 01 00/*#####从这里开始后面就是内容了 注KCS#8仅仅是在此处插入部分内容#####*//*RSA Modulus内容和公钥开头格式一致参考公钥部分*/02 81 81 0098C3DF8CDFE444CC3B58AB006BB3F6ACFCECBC1911393A69EA395D047E41220888E27336D51059D9DEA4632DB0C04DF981C4D43A73A1606BC9D7DBC825107FDA2FF446D8A76923C28C52A280B3337276C1D27A1F4C48A71DE73812E0DB84D2EF9E47B081F243968A988B0D0998DFC929337EA945674D425A486930E8E4884927/*RSA Exponent*/02 03 010001/*RSA D*/02 81 80706352591AF29E26BED689DFE25CE0F2FD94D10184295D2F44D174FC744248DE8C8E45032717437345181D9B24B925E49533108BFC3BD26B1A710351A8EB0D937D8EEAF54FC6BE0D7D355A215E7D26FF59E525C6891991657791C3492C29874EC1A0C926EF73113347668305266F2CABFB4624F4023CD7ACA19459B2C2FB9A39/*RSA P*/02 4100CE23A8CAB7AD1BBEEE955EFB50A325146F2323F5E08E05AB52E3D8D1BEFDF6E9331CF79D5EF5371B9C3D1CC49AD5D4DEB2222FBEF9E8F07DA81B7987FEF8DEB5/*RSA Q*/02 4100BDB73C2939416C8F533309D5910A6CB7E724826DE0A510E101F43F2EDEEBF20D8A007B09BFEC1B0090A0BBC3E0A8CF6642357167EEFCF9A2C443E879AEF315EB/*RSA DP*/02 40 63573DFDCB7C8A157E66CFAA2F57200473F6AC5ACEC7C2A5A8C192F8A9A13C3F6FD972DF0D270152B5FDA18281D7B0C94D713A2F3FC2693B352B606B108E20CD/*RSA DQ*/02 41009210B3D7216807C749CD6FF2E85AD85DB72EDAE4F222E49DF8BD2EB04D9DE79D18F549C5B5E878D9B480AC50217697482A0DAFA4CFD221F97996B73488C84BC5/*RSA InverseQ*/02 4006F0F9DD96248A27FAFB94B0A93676D653A99C7C7B9DCDADE65414C6889284B924F26A23AFFA86AF3FD804453B73FDFEA9310CC909BFC9928D5F757198B1075DPEM PKCS#8私钥编码格式/*****1024字节PKCS#8私钥*****/-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJjD34zf5ETMO1ir
AGuz9qz87LwZETk6aeo5XQRQSIIiOJzNtUQWdnepGMtsMBNYHE1DpzoWBrydfb
yCUQf9ov9EbYp2kjwoxSooCzM3J2wdJ6H0xIpx3nOBLg24TS755HsIHyQ5aKmIsN
CZjfySkzfqlFZ01CWkhpMOjkiEknAgMBAAECgYBwY1JZGvKeJr7Wid/iXODy/ZTR
AYQpXS9E0XT8dEJI3oyORQMnF0NzRRgdmyS5JeSVMxCL/DvSaxpxA1Go6w2TfY7q9U/Gvg19NVohXn0m/1nlJcaJGZFld5HDSSwph07BoMkm73MRM0dmgwUmbyyr0Yk9AI816yhlFmywvuaOQJBAM4jqMq3rRu7pVe1CjJRRvIyP14I4Fq1Lj2NG/fbp
Mxz3nV71NxucPRzEmtXU3rIiL7756PB9qBt5h/743rUCQQC9tzwpOUFsj1MzCdWR
Cmy35ySCbeClEOEB9D8u3uvyDYoAewm/7BsAkKC7wCoz2ZCNXFn7vz5osRD6Hmu8xXrAkBjVz39y3yKFX5mz6ovVyAEc/asWs7HwqWowZL4qaE8P2/Zct8NJwFStf2h
goHXsMlNcTovP8JpOzUrYGsQjiDNAkEAkhCz1yFoB8dJzW/y6FrYXbcu2uTyIuSd
L0usE2d550Y9UnFteh42bSArFAhdpdIKg2vpM/SIfl5lrc0iMhLxQJABvD53ZYk
iif65SwqTZ21lOpnHx7nc2t5lQUxoiShLkk8mojr/qGrz/YBEU7c/3qTEMyQm/
yZKNX3VxmLEHXQ
-----END PRIVATE KEY-----/*****二进制表述*****/30820276020100300D06092A864886F70D0101010500048202603082025C0201000281810098C3DF8CDFE444CC3B58AB006BB3F6ACFCECBC1911393A69EA395D047E41220888E27336D51059D9DEA4632DB0C04DF981C4D43A73A1606BC9D7DBC825107FDA2FF446D8A76923C28C52A280B3337276C1D27A1F4C48A71DE73812E0DB84D2EF9E47B081F243968A988B0D0998DFC929337EA945674D425A486930E8E48849270203010001028180706352591AF29E26BED689DFE25CE0F2FD94D10184295D2F44D174FC744248DE8C8E45032717437345181D9B24B925E49533108BFC3BD26B1A710351A8EB0D937D8EEAF54FC6BE0D7D355A215E7D26FF59E525C6891991657791C3492C29874EC1A0C926EF73113347668305266F2CABFB4624F4023CD7ACA19459B2C2FB9A39024100CE23A8CAB7AD1BBEEE955EFB50A325146F2323F5E08E05AB52E3D8D1BEFDF6E9331CF79D5EF5371B9C3D1CC49AD5D4DEB2222FBEF9E8F07DA81B7987FEF8DEB5024100BDB73C2939416C8F533309D5910A6CB7E724826DE0A510E101F43F2EDEEBF20D8A007B09BFEC1B0090A0BBC3E0A8CF6642357167EEFCF9A2C443E879AEF315EB024063573DFDCB7C8A157E66CFAA2F57200473F6AC5ACEC7C2A5A8C192F8A9A13C3F6FD972DF0D270152B5FDA18281D7B0C94D713A2F3FC2693B352B606B108E20CD0241009210B3D7216807C749CD6FF2E85AD85DB72EDAE4F222E49DF8BD2EB04D9DE79D18F549C5B5E878D9B480AC50217697482A0DAFA4CFD221F97996B73488C84BC5024006F0F9DD96248A27FAFB94B0A93676D653A99C7C7B9DCDADE65414C6889284B924F26A23AFFA86AF3FD804453B73FDFEA9310CC909BFC9928D5F757198B1075D/*****二进制分解和PKCS#1只是多了一段数据详细结构参考PKCS#1的*****//*后续内容长度*/30 82 0276/*固定版本号*/02 01 00/*#####相对于KCS#1仅仅是在此处开始插入部分数据 Begin#####*//*
固定内容 encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA 1.2.840.113549.1.1.1其实不懂是啥玩意
*/30 0D 06092A864886F70D0101010500/*后续内容长度后面内容长度为0x0260字节和开头格式一致*/04 82 0260/*后续内容长度后面内容长度为0x025C字节和开头格式一致*/30 82 025C/*固定版本号*/02 01 00/*#####相对于KCS#1仅仅是在此处结束插入部分数据 End#####*//*RSA Modulus内容*/02 81 81 0098C3DF8CDFE444CC3B58A......后续内容省略...C# RSA操作类主要文件RSA.cs此文件依赖RSA_PEM.cs用于进行加密、解密、签名、验证、秘钥导入导出操作。[构造函数] new RSA(1024)通过指定密钥长度来创建RSA会生成新密钥。[构造函数] new RSA(xml)通过XML格式密钥对创建RSAxml可以是公钥或私钥XML格式如RSAKeyValueModulusmMPfjN/kRMw7WKsAa7P2rPzsvBkROTpp6jldBH5BIgiI4nM21RBZ2d6kYy2wwE35gcTUOnOhYGvJ19vIJRB/2i/0RtinaSPCjFKigLMzcnbB0nofTEinHec4EuDbhNLvnkewgfJDloqYiw0JmN/JKTNqUVnTUJaSGkw6OSISSc/ModulusExponentAQAB/Exponent/RSAKeyValue[构造函数] new RSA(PEM, any)通过PEM格式密钥对创建RSAPEM可以是公钥或私钥支持PKCS#1、PKCS#8格式PEM格式如-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYw9M3REzDtYqwBrs/as/Oy8
GRE5OmnqOV0EfkEiCIjiczbVEFnZ3qRjLbDATfmBxNQ6c6Fga8nX28glEH/aL/RG2KdpI8KMUqKAszNydsHSeh9MSKcd5zgS4NuE0ueR7CB8kOWipiLDQmY38kpM36p
RWdNQlpIaTDo5IhJJwIDAQAB
-----END PUBLIC KEY-----[方法] .ToXML([false]是否仅仅导出公钥)导出XML格式秘钥对。如果RSA包含私钥默认会导出私钥设置仅仅导出公钥时只会导出公钥不包含私钥只会导出公钥。[方法] .ToPEM_PKCS1|.ToPEM_PKCS8([false]是否仅仅导出公钥)导出PEM格式秘钥对两个方法分别导出PKCS#1、PKCS#8格式。如果RSA包含私钥默认会导出私钥设置仅仅导出公钥时只会导出公钥不包含私钥只会导出公钥。[方法] .Encode(字符串|bytes)加密操作支持任意长度数据。[方法] .DecodeOrNull(Base64字符串|bytes)解密操作解密失败返回null支持任意长度数据。[方法] .Sign(hash, 字符串|bytes)通过hash算法MD5、SHA1等来对数据进行签名。[方法] .Verify(hash, sign, 字符串)通过hash算法MD5、SHA1等来验证字符串是否和sign签名一致。RSA_PEM.cs此文件不依赖任何文件可以单独copy来用RSA_Unit里面的方法可以忽略[静态方法] .FromPEM(PEM)通过PEM格式秘钥对来创建RSACryptoServiceProviderPEM可以是公钥或私钥。[静态方法] .ToPEM(RSACryptoServiceProvider, exportPublicOnly, usePKCS8)将RSA中的密钥对导出成PEM格式usePKCS8false时返回PKCS#1格式否则返回PKCS#8格式。如果RSA包含私钥默认会导出私钥设置仅仅导出公钥时只会导出公钥不包含私钥只会导出公钥。次要文件RSA_Unit.cs封装的一些通用方法如base64。没有此文件也可以引用的地方用别的代码实现。Program.cs控制台入口文件用来测试的里面包含了主要的使用用例。图例RSA工具控制台运行原文地址: https://www.cnblogs.com/xiangyuecn/p/9922325.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com