簡體   English   中英

具有OpenSSL密鑰和Bouncy Castle的C#RSA實現

[英]C# RSA implementation with OpenSSL keys & Bouncy castle

我正在嘗試使用OpenSSL生成的密鑰對和Bouncy Castle在C#中實現字符串加密-解密。

OpenSSL授予我密鑰對,我將其分成2個文件。 現在,我使用Bouncy Castle的Pemreader讀取密鑰並將其更改為AsymmetricKeyParameters。

下面的代碼可以運行,但是解密后的字符串與原始字符串不同-我得到了一堆?。

如果我打印出密鑰,它們看起來就像在文本文件中一樣。

有人可以指出我做錯了嗎? 原因是翻書程序或使用引擎。 無需填充的2048位密鑰,這種加密的強度如何?

        string test = "qwerty12345";
        AsymmetricKeyParameter keyparmeter = readPublicKey(public_path); // Read public key into string

        /* Print the test key */
        Console.WriteLine("test key = " + test);

        /* Convert test to byte array */
        byte[] bytes = new byte[test.Length * sizeof(char)];
        System.Buffer.BlockCopy(test.ToCharArray(), 0, bytes, 0, bytes.Length);

        byte[] cipheredbytes = null;

        /* Initiate rsa engine */
        RsaEngine e = new RsaEngine();
        e.Init(true, keyparmeter);          // initialize engine true, encrypting

        /* Crypt! */
        cipheredbytes = e.ProcessBlock(bytes, 0, bytes.Length);

        // ## NOW DECRYPTION ##

        /* Get the private key */
        AsymmetricKeyParameter privkeyparameter = readPrivKey(privkey_path);

        byte[] reversedbytes = null;

        /* Initiate rsa decrypting engine */
        RsaEngine d = new RsaEngine();
        d.Init(false, privkeyparameter);          // initialize engine false, decrypting

        /* Decrypt! */
        reversedbytes = d.ProcessBlock(cipheredbytes, 0, cipheredbytes.Length);

        char[] chars = new char[cipheredbytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(cipheredbytes, 0, chars, 0, cipheredbytes.Length);
        string reversedtest = new string(chars);

    ### PEMREADING ###
    /* Convert PEM into AsymmetricKeyParameter */
    private AsymmetricKeyParameter readPublicKey(string path_to_key)
    {
        RsaKeyParameters asmkeypar;

        using(var reader = File.OpenText(path_to_key))
            asmkeypar = (RsaKeyParameters) new PemReader(reader).ReadObject();

        return asmkeypar;
    }

    /* Convert PEM into AsymmetricKeyParameter */
    private AsymmetricKeyParameter readPrivKey(string path_to_key)
    {
       AsymmetricCipherKeyPair asmkeypar;

        using (var reader = File.OpenText(path_to_key))
            asmkeypar = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();

        return (RsaKeyParameters) asmkeypar.Private;
    }

您正在使用基本RSA算法。 這也稱為原始RSA或教科書RSA。 基本上,它執行模冪運算,但不執行填充或取消填充操作。 因此,您收到的是值前面的明文+零,因為似乎沒有發生填充。

最后,您應該執行字符編碼,而不是System.Buffer.BlockCopy ,后者可能會使情況變得一團糟,因為它必須對.NET中的Unicode編碼的字符串進行操作。

我可以向您介紹有關加密的問題該問題試圖列出對原始/教科書RSA的所有可能的攻擊。 很多情況下,您的代碼安全的幾率約為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM