- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用以下 C# 代码对 PEM 文件使用 rsa 进行加密和解密:
public string encrypt(string elementToEncrypt, string pathPrivateKey) {
string pem = System.IO.File.ReadAllText(pathPrivateKey);
byte[] Buffer = getBytesFromPEMFile(pem, "PUBLIC KEY");
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
System.Security.Cryptography.RSAParameters rsaParam = rsa.ExportParameters(false);
rsaParam.Modulus = Buffer;
rsa.ImportParameters(rsaParam);
byte[] encryptedMessageByte = rsa.Encrypt(Convert.FromBase64String(elementToEncrypt),false);
return Convert.ToBase64String(encryptedMessageByte);
}
public string decrypt(string elementToDesencrypt, string pathPublicKey)
{
string pem = System.IO.File.ReadAllText(pathPublicKey);
byte[] Buffer = getBytesFromPEMFile(pem, "RSA PRIVATE KEY");
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
System.Security.Cryptography.RSAParameters rsaParam = rsa.ExportParameters(false);
rsaParam.Modulus = Buffer;
rsa.ImportParameters(rsaParam);
byte[] encryptedMessageByte = rsa.Decrypt(Convert.FromBase64String(elementToDesencrypt), false);
return Convert.ToBase64String(encryptedMessageByte);
}
public byte[] getBytesFromPEMFile(string pemString, string headerPEM) {
string header = String.Format("-----BEGIN {0}-----", headerPEM);
string footer = String.Format("-----END {0}-----", headerPEM);
int start = pemString.IndexOf(header, StringComparison.Ordinal) + header.Length;
int end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start;
if (start < 0 || end < 0)
{
return null;
}
return Convert.FromBase64String(pemString.Substring(start, end));
}
但问题是当我想在行中解密时:
byte[] encryptedMessageByte = rsa.Decrypt(Convert.FromBase64String(elementToDesencrypt), false);
我的 pem 文件是:
key .pem
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDLPKI8p+ANRabCTdLvJjuT0wx1kt2voJ0+BtdTRBqhJQbRgM2P
dtHilmaVSyiVtD5l1mTl+h8mFRBttiH0VgW3KuyvFk2mrjF78MrsXlYoHVizGgeh
UWVUsNh7EhdgF/hM7miZMXsHoa/MEQwgytPwjpDbOXXECZz8CpHiyNOftwIDAQAB
AoGAUrmXgAEFHeHgAu8SkO2LCpy5UZI6UiaaWokGVIpAHJ+pqtU21tKSlByMHPC+
0FDRpTojT8kDrMieK0obgA0TvcUaARVPGZsLjB4WZLKh7e8LPaUTvAS9dTmKd7xB
4YGFKY+AJb38VdDU9CoQMsiPtIIiPWz09lgGvYRGzXmTBwECQQDsEtLRyOijXISK
iFhtdpBI4yAmnTYyYLrsPXgS7asa80h7vnTmOlUpuqsxZtWNVGcpNiYG4y8OpJU5
Jr8IkNnXAkEA3GRC63+SEbEo5wXcrHF+tzxfFmk3yzS38w5jtGik3yrp6psyjaQ8
Q+D3RaKjGYtjTH3pmljRH2OGEvrNwvFtIQJAFkLgJnAvn9gFl5qr3AamLHleesWw
aqe8eLKDNCW9UNlIKIMZOuydQ0YbBpmP4bfn0ncMtvGNanASskT5FrGyGQJASE7k
3dsnE4LqhpGXy0QZbQjzsain05XiXG52K/TBUy8DPCPbPDmMREEFH+WyWWkwFSKi
iC9nvUKr9IIxDCqlwQJBAIDwEg6yVGdVCQry+OEGtsiaGPveX+lAx/kULba0wfRq
KaQAstQrT7p+ONtC8x8NHDE/ayjz6GlEZ7svR/LZO7w=
-----END RSA PRIVATE KEY-----
和 pubkey.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLPKI8p+ANRabCTdLvJjuT0wx1
kt2voJ0+BtdTRBqhJQbRgM2PdtHilmaVSyiVtD5l1mTl+h8mFRBttiH0VgW3Kuyv
Fk2mrjF78MrsXlYoHVizGgehUWVUsNh7EhdgF/hM7miZMXsHoa/MEQwgytPwjpDb
OXXECZz8CpHiyNOftwIDAQAB
-----END PUBLIC KEY-----
我读过如果我想解密,我应该将两个 key 都放在一个 pem 文件中,但如果我这样做,我将不知道要放什么
rsaParam.Modulus = Buffer;
我的意思是,我是否必须将两个缓冲区(私有(private)和公共(public))混合为一个?如果是这样,我应该怎么做?
感谢您的帮助。
最佳答案
.NET 没有对读取“裸 key ”文件的内置支持。
如果将公钥文件的 Base64 组件粘贴到 https://lapo.it/asn1js/,您会发现它可以分解为
SEQUENCE
SEQUENCE
OBJECT IDENTIFIER rsaEncryption
NULL
BIT STRING
SEQUENCE
INTEGER (1024-bit) ...
INTEGER 65537
要将其导入 .NET,您需要将第一个整数(本例中为 1024 位)的字节(不是十进制值)复制到 RSAParameters.Modulus 值中,并将字节第二个整数到 RSAParameters.Exponent 值。在这两种情况下,如果有前导 00 字节,则需要将其关闭。
对于您当前的 key :
RSAParameters rsaParams = new RSAParameters
{
Modulus = YourFavoriteHexParser(
"CB3CA23CA7E00D45A6C24DD2EF263B93D30C7592DDAFA09D3E06D753441AA125" +
"06D180CD8F76D1E29666954B2895B43E65D664E5FA1F2615106DB621F45605B7" +
"2AECAF164DA6AE317BF0CAEC5E56281D58B31A07A1516554B0D87B12176017F8" +
"4CEE6899317B07A1AFCC110C20CAD3F08E90DB3975C4099CFC0A91E2C8D39FB7"),
Exponent = new byte[] { 0x01, 0x00, 0x01 },
};
RSA rsa = RSA.Create();
rsa.ImportParameters(rsaParams);
return rsa;
更一般地说,您需要将公钥文件解析为 ASN.1 DER blob,然后从有效负载中使用模数和指数值。
如果您需要多次执行此操作,最简单的解决方法是使用 OpenSSL 为 key 文件制作自签名证书,因为 .NET 可以使用来自证书的 key (cert.GetRSAPublicKey()
).
添加对裸键的支持在 .NET Core 路线图 (https://github.com/dotnet/corefx/issues/20414) 中,并且可以合理地假设在它被添加到 .NET Core 之后它将进入 .NET Framework。
要解密,您需要私钥。同样,最简单的答案是从 key 制作自签名证书,将证书和 key 捆绑到一个 PFX/PKCS#12 文件中,然后使用 cert.GetRSAPrivateKey()
。但是,对于困难的方法:
粘贴私钥blob我们看到是这样的
SEQUENCE
INTEGER 0
INTEGER (1024-bit)
INTEGER 65537
INTEGER (1023-bit)
INTEGER (512-bit)
INTEGER (512-bit)
INTEGER (509-bit)
INTEGER (511-bit)
INTEGER (512-bit)
在https://www.rfc-editor.org/rfc/rfc8017#appendix-A.1.2中我们看到RSAPrivateKey
结构看起来像
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
那个版本== 0 意味着只有两个素数。现在我们遇到了一些怪癖。在 .NET 中,D
值必须与 Modulus
具有相同的大小。如果 D
碰巧出现“1016 位”数字(或更小),则需要插入前导 0x00
值。 .NET 还要求 P
恰好是 Modulus
大小的一半(如果重要则四舍五入),并且 Q
、DP
、DQ
和 InverseQ
都具有与 P
相同的大小。
所以,再一次,对于你的 key :
RSAParameters rsaParams = new RSAParameters
{
Modulus = YourFavoriteHexParser(
"CB3CA23CA7E00D45A6C24DD2EF263B93D30C7592DDAFA09D3E06D753441AA125" +
"06D180CD8F76D1E29666954B2895B43E65D664E5FA1F2615106DB621F45605B7" +
"2AECAF164DA6AE317BF0CAEC5E56281D58B31A07A1516554B0D87B12176017F8" +
"4CEE6899317B07A1AFCC110C20CAD3F08E90DB3975C4099CFC0A91E2C8D39FB7"),
Exponent = new byte[] { 0x01, 0x00, 0x01 },
D = YourFavoriteHexParser(
"52B9978001051DE1E002EF1290ED8B0A9CB951923A52269A5A8906548A401C9F" +
"A9AAD536D6D292941C8C1CF0BED050D1A53A234FC903ACC89E2B4A1B800D13BD" +
"C51A01154F199B0B8C1E1664B2A1EDEF0B3DA513BC04BD75398A77BC41E18185" +
"298F8025BDFC55D0D4F42A1032C88FB482223D6CF4F65806BD8446CD79930701"),
P = YourFavoriteHexParser(
"EC12D2D1C8E8A35C848A88586D769048E320269D363260BAEC3D7812EDAB1AF3" +
"487BBE74E63A5529BAAB3166D58D546729362606E32F0EA4953926BF0890D9D7"),
Q = YourFavoriteHexParser(
"DC6442EB7F9211B128E705DCAC717EB73C5F166937CB34B7F30E63B468A4DF2A" +
"E9EA9B328DA43C43E0F745A2A3198B634C7DE99A58D11F638612FACDC2F16D21"),
DP = YourFavoriteHexParser(
"1642E026702F9FD805979AABDC06A62C795E7AC5B06AA7BC78B2833425BD50D9" +
"482883193AEC9D43461B06998FE1B7E7D2770CB6F18D6A7012B244F916B1B219"),
DQ = YourFavoriteHexParser(
"484EE4DDDB271382EA869197CB44196D08F3B1A8A7D395E25C6E762BF4C1532F" +
"033C23DB3C398C4441051FE5B25969301522A2882F67BD42ABF482310C2AA5C1"),
InverseQ = YourFavoriteHexParser(
"80F0120EB2546755090AF2F8E106B6C89A18FBDE5FE940C7F9142DB6B4C1F46A" +
"29A400B2D42B4FBA7E38DB42F31F0D1C313F6B28F3E8694467BB2F47F2D93BBC"),
};
RSA rsa = RSA.Create();
rsa.ImportParameters(rsaParams);
return rsa;
关于c# - 如何使用 PEM 文件中的 rsa 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46948083/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!