首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么所有的RSA算法,但结果是完全不同的?

为什么所有的RSA算法,但结果是完全不同的?
EN

Stack Overflow用户
提问于 2022-09-23 16:18:16
回答 2查看 130关注 0票数 -1

我最近正在学习rsa加密和解密。我尝试在C#中加密一些数据并验证结果。我发现,我用C#编写的代码的输出结果与一些RSA在线计算网站的输出结果不一致。这是正常的吗?

首先,我使用openssl生成了私钥和公钥:

私钥:

代码语言:javascript
运行
复制
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDTlCZFucurE+QNupniPUXz5RwNdhRAplB+jd51U4NTcpDl4AL3
LppKdRxEyt4FlvLiE66tmonEJTc4BcaRurxxXOuY+0IS4l28FynYT/yDpdoiop0J
f2NCa8V5nCBISKp1Lgvz7AbHBw+3KNCF1UdrOeRsr/GBOSXosmTzPMRUNwIDAQAB
AoGALyDC3akjCrplhAFaoaBQYqFX/E+e9z+Uknv7X1r416+fQvUA9Bo3V/p6D4C4
r7oN4/nKYPUZVs2LXTk8H93ed2IikcevB4vnHgO3ym5vt+KyrmCemwyV/rbA5kg5
sDvMqXJr2/FfQtLR3GLumZJN2r5Hcq1Kgo3tgx7gsoZm4JECQQDxCoSeyWPuyQKx
3aHWJkVybmHD5d6HuFFyaM4pOAOXaGrtkZSrh3c+NJhAuW62d+oE8kwCNymz74G5
Pq+5yRftAkEA4LWOGKAeidLFM2RON3DFMNDH3KEB4C9144SilzVr6dDEOgBqdCya
+vazx2J0OV8Bm5ocqtTBOT4ZmD7BXtTQMwJASEwYVSwgnjmKZmEMrpfSEq2LA2AK
K/kb7M4EsBZN9XbrQ5B74CsEmBLca+VykKZM+ejW5X84MfEvnqlvubDYTQJBAKAv
7OcTJhH8JcY4CCYvhvMAsqlOQecODk0t3TZLx+z7fRcX+stsjOLBAXHudon7d0r0
duE1H7Vt1pMYkYLH1M8CQEZ76ME68DE7DkTPhBvPL22O898Kt89bCen68EVv3kl8
7k4XsAGrLldX6xvV/oeLDI+uRiYqZylS2PFY3XcT3f8=
-----END RSA PRIVATE KEY-----

公用钥匙:

代码语言:javascript
运行
复制
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTlCZFucurE+QNupniPUXz5RwN
dhRAplB+jd51U4NTcpDl4AL3LppKdRxEyt4FlvLiE66tmonEJTc4BcaRurxxXOuY
+0IS4l28FynYT/yDpdoiop0Jf2NCa8V5nCBISKp1Lgvz7AbHBw+3KNCF1UdrOeRs
r/GBOSXosmTzPMRUNwIDAQAB
-----END PUBLIC KEY-----

这是我的测试c#代码:

代码语言:javascript
运行
复制
string InputText = "ABCDEFG123456";

{
    string sk = File.ReadAllText("D:\\rsa_private_key.pem");
    string sk2 = sk.Replace("\n", "");

    var rsa = RSA.Create();

    rsa.ImportFromPem(sk.ToArray());
    var text = Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(InputText), RSAEncryptionPadding.Pkcs1));

    Console.WriteLine(text);

}

产出如下:

代码语言:javascript
运行
复制
WecnM6F8+oVuOR7OhOMeDwzrfWsYeW0uTMZC2AJ9a6AhzVIZgPhVZv1heMPN8yfhnBo03Vh/hzUXGeUZpAO7PVQ7mFKCRARy35cTcGxTpGLEhhAUe1cqj92rO5zlm/fIQOi0PraeduqD2HRQOSHz3eq71oHdy22s5sb4WNwyTj8=

然后,我又在本站上做了同样的事情

产出如下:

代码语言:javascript
运行
复制
btZnhouzYuYk3grzhI9MJinlrmRmsVhmUBUpW0pKpXXZ2VPgw97Cx869+r7WMDQFRG34jELDIpeADNxJeUnnOwm1J5z489THaYO6pqQ7UWeXyMhus05RSPcNDjvJjjJcZ/FyxUNhd7JNqaioTQB8SKo+p3BD/VkMH0tl/I90WTc=

此外,我还在其他一些工具上测试了它,它们的输出与网站一致,与我的演示程序不一致,所以我想问,我的C#代码有什么问题?还是rsa加密算法本身不稳定?

我能想到的一个不同之处可能是,我粘贴到网站上的私钥是一个带有新行的字符串。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-24 08:05:09

我使用openssl,它在网站上产生相同的结果:

代码语言:javascript
运行
复制
std::string decrypt_string(const void* data, size_t length)
{
    BIO* bio = BIO_new_mem_buf(pk.c_str(), (int)pk.size());
    
    RSA* rsa = NULL;
    PEM_read_bio_RSA_PUBKEY(bio, &rsa, 0, 0);
    
    char buf[1024] = {0};
    
    int ret = RSA_public_decrypt(0x80, (const unsigned char*)data, (unsigned char*)buf, rsa, RSA_PKCS1_PADDING);
    
    if(ret == -1)
    {
        BIO_free(bio);
        
        printf("decrypt error:%d\n", ret);
        return "Error";
    }
    
    BIO_free(bio);
    
    std::string str = buf;
    
    return buf;
}

std::string encrypt_string(const std::string& str)
{
    RSA* rsa = NULL;
    BIO* bio = BIO_new_mem_buf(sk.c_str(), (int)sk.size());
    
    PEM_read_bio_RSAPrivateKey(bio, &rsa, 0,0);
    
    assert(rsa!=NULL);
    
    char buf[1024];
    int ret = RSA_private_encrypt((int)str.length(), (const unsigned char *)str.data(), (unsigned char*)buf, rsa, RSA_PKCS1_PADDING);
    
    if(ret == -1)
    {
        BIO_free(bio);
        
        printf("decrypt error:%d\n", ret);
        return "Error";
    }
    
    BIO_free(bio);
    
    std::string str2 = base64_encode((unsigned char const*)buf, ret);
    
    return str2;
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-17 03:17:24

因为rsa.Encrypt函数在应用该函数之前对明文进行预处理。

代码语言:javascript
运行
复制
Enc(m; K) = R(pre(m),K)

Dec(c; k) = post(R(c,k))

OAEP-pre(m):
r = **random nonce**

X = (m || 00...0) XOR H(r) // pad m with zeros

Y = r XOR H(X)

output X || Y

访问dec.php

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73830521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档