【问题标题】:Decrypting RSA using OpenSSL.NET with Existing Key使用 OpenSSL.NET 和现有密钥解密 RSA
【发布时间】:2011-11-06 05:49:58
【问题描述】:

我有以下代码使用 OpenSSL.Net 生成 OpenSSL RSA 公钥和私钥。但是,我似乎找不到使用给定私钥解密数据的方法。我知道如果我调用生成密钥,然后调用相应的方法来加密和解密数据,它就可以正常工作。但是,如果我试图从给定公钥的外部源解密某些内容,我该如何使用该密钥解密。

注意:请不要给出不使用 OpenSSL.NET 的示例。 Microsoft Cryptographic 提供程序比 OpenSSL 慢得多,不符合我的速度要求。

谢谢!

public class AsymmetricKeyResult
{
    public string PublicKey { get; set; }
    public string PrivateKey { get; set; }

    public AsymmetricKeyResult(string publicKey, string privateKey)
    {
        this.PublicKey = publicKey;
        this.PrivateKey = privateKey;
    }
}

public static AsymmetricKeyResult GenerateAsymmetricKeys(int keyLength)
{
    RSA rsa = new RSA();
    rsa.GenerateKeys(keyLength, 0x10021, null, null);
    AsymmetricKeyResult kResult = new AsymmetricKeyResult(rsa.PublicKeyAsPEM, rsa.PrivateKeyAsPEM);

    return kResult;
}

【问题讨论】:

    标签: c# encryption openssl rsa


    【解决方案1】:

    我发现了这个,并认为这是我祈祷的答案。但是,使用 openssl(1.0.0e Mac os x)生成 pub/priv 密钥,我无法从加密文本中再次获取明文 - 是否缺少 GetBytes/Baseencode 类型步骤?你遇到过这个吗?

    编辑:我刚刚发布了一个使用 UTF8 编码而不是 ASCII 的不同示例,它有效!

    namespace testopenssl2
    {
    class Program
    {
    
        public static byte[] AsymmetricEncrypt(string publicKeyAsPem, byte[] payload)
        {
            CryptoKey d = CryptoKey.FromPublicKey(publicKeyAsPem, null);
            RSA rsa = d.GetRSA();
            byte[] result = rsa.PublicEncrypt(payload, RSA.Padding.PKCS1);
            rsa.Dispose();
            return result;
        }
    
        public static byte[] AsymmetricDecrypt(string privateKeyAsPem, byte[] payload)
        {
            //CryptoKey d = CryptoKey.FromPrivateKey(privateKeyAsPem, null);
            CryptoKey d = CryptoKey.FromPrivateKey(privateKeyAsPem, "pass");
            RSA rsa = d.GetRSA();
            byte[] result = rsa.PrivateDecrypt(payload, RSA.Padding.PKCS1);
            rsa.Dispose();
            return result;
        }
    
        static void Main(string[] args)
        {
            String t = @"-----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbhcU+fhYmYLESZQAj1hKBXsNY
    si0kYHNkxpP7ftxZiTFowWUVXHzQgkcYiCNnp3pt1eG6Vt0WDzyFYXqUUqugvX41
    gkaIrKQw/sRiWEx49krcz7Vxr3dufL6Mg3eK7NyWDGsqwFrx/qVNqdhsHg12PGNx
    IMY4UBtxin2A8pd4OwIDAQAB
    -----END PUBLIC KEY-----";
            String p = @"-----BEGIN RSA PRIVATE KEY-----
    Proc-Type: 4,ENCRYPTED
    DEK-Info: DES-EDE3-CBC,0A128C2617BD2EB1
    
    pTDtXB+mockO7fvVqn4fwGnSb1Zv3HaMAALtpiB7Rn64eAHL7psKQIIM3qoshDWF
    XgXDdTnMOGO7wtYkd9R7iJYxgt19EuEdtu2SLLXQuN4ll+JSR2R/34dF19iMXI30
    d3pe7obTIwKdyRGuu8GgEm6bGai4pkqptP0HRA6qdMI2+Qfl9+VqUuvIm7tfpIRd
    /ZLENe756IrGDvI7lGx39Md/H2sgAJsWkSYubhmtxVJ0IEvbPuKDC5V5oLyTOoy+
    6sc6ly57C4XHaTLhAKnYEvZAddnXg/e/VtfmTpqKx3n7D6FAKo1RjAjeZqEvefZd
    XAhh19YhZq3mdZNYUt7ojUarf/q3zrtTMLUxHdR0Be/VaQC5AE0d6quKyUQgxiti
    XNRS8xk9IJJqJLFSHO3ET+oTfcs+kLPuUDHqq0hY/OgW/THcDgPY1cDwtOX9yuI3
    YDoFTb3SXzRTmk2ui33f96wNPwzIAp9+TJzITxJYbF233Pz4YWuabrFuoNWZnwtT
    E/o6wcGfvAXTQkAKzwfLbTDmg5SSiGokoEcgm7qpfmQxKdmV1LmbW88DuAgdWggm
    Qf3ydZ2IrrtD1o+XP7JraeVOql0OK77pJh/bcr3bLiAT8YtsQUZLnOjkbDc3F1zW
    BGr6eeqUHxY6cqKieokhl9cBBjWuxJQL2h997svBufWdNOjTA4+32lXzDzi7bUxC
    xzIqZ7nm3YC2zUjla/l3Smz5KitqU5Y3Q9URpXOW+qMiPxmTHYOEcRDy9yh2U4iA
    CoTD6q0ZNJLEo3EVcDB+26O663/mQLuR69xstUgqHpSzGvXbqrmezA==
    -----END RSA PRIVATE KEY-----";
    
            System.Text.Encoding enc = System.Text.Encoding.ASCII;
            String s = "hello";
            byte[] payload = enc.GetBytes(s);
            Console.WriteLine("s: {0}", s);
    
            byte[] byte_encData = AsymmetricEncrypt(t,payload);
    
            String res;
            res = Convert.ToBase64String(byte_encData);
            Console.WriteLine("encypted: {0}", res);
    
            byte[] byte_decrypted = AsymmetricDecrypt(p, byte_encData);
            String res_unenc;
            res_unenc = Convert.ToBase64String(byte_decrypted);
    
            // works!
            Console.WriteLine("decrypted: {0}", res_unenc);
    
        }
        }
    }
    

    【讨论】:

    • 我有以---BEGIN RSA PUBLIC KEY ---开头的密钥,如何转换成上述格式?
    • "如何将其转换为上述格式?" - 使用 OpenSSL 中的*_PUBKEY 函数。请参阅How can I transform between the two styles of public key format, one “BEGIN RSA PUBLIC KEY”, the other is “BEGIN PUBLIC KEY”
    • 我不明白,我以为我们必须使用公钥解密和私钥加密?
    • 以防万一其他人遇到这个并感到困惑,我将解释如何使用场景使用密钥。例如,我有一个文件想秘密地与你分享,我将使用你的 PUBLIC 密钥加密我的文件,然后再将其发送给你。现在我可以以任何我喜欢的方式发送加密文件,就像我喜欢的那样不安全,但只有你可以使用你的私钥解密它,而原始文件仍然在我身边。
    【解决方案2】:

    我最终通过 OpenSSL.NET 托管包装器上的对象浏览器解决了这个问题。这有效:

        public static byte[] AsymmetricEncrypt(string publicKeyAsPem, byte[] payload)
        {
            CryptoKey d = CryptoKey.FromPublicKey(publicKeyAsPem, null);
            RSA rsa = d.GetRSA();
            byte[] result = rsa.PublicEncrypt(payload, RSA.Padding.PKCS1);
            rsa.Dispose();
            return result;
        }
    
        public static byte[] AsymmetricDecrypt(string privateKeyAsPem, byte[] payload)
        {
            CryptoKey d = CryptoKey.FromPrivateKey(privateKeyAsPem, null);
            RSA rsa = d.GetRSA();
            byte[] result = rsa.PrivateDecrypt(payload, RSA.Padding.PKCS1);
            rsa.Dispose();
            return result;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多