当前位置: 首页 > 知识库问答 >
问题:

用OpenSSL密钥实现C#RSA&Bouncy castle

曹浩波
2023-03-14

如果我打印出钥匙,它们看起来就像在文本文件中一样。

谁能指出我做错了什么?pemreading程序或引擎使用似乎是原因。使用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;
    }

共有1个答案

方嘉言
2023-03-14

您正在使用基本RSA算法。这也被称为原始或教科书RSA。基本上,它执行模幂运算,但不执行填充或取消填充。因此,您接收到的是明文+值前面的零,因为取消填充似乎没有发生。

最后,您应该执行字符编码,而不是system.buffer.blockcopy,后者可能会把它搞得一团糟,因为它必须对.NET中的Unicode编码字符串进行操作。

我可以向您推荐关于crypto的这个问题,它试图列出对原始/教科书RSA的所有可能的攻击。有很多,你的代码安全的几率大约为零。

 类似资料:
  • 在许多情况下,安全软件涉及(桌面)应用程序和web界面之间的交互。对于(RSA)非对称加密,我们使用OpenSSL的C库(目前版本为1.0.2d)和OpenSSL PHP库。 所有标准的东西: 私有加密(C)数据和公共解密(PHP) 公共加密(C)数据和私有解密(PHP) 作品还有另一种方法:PHP- 此外,使用PHP生成加密的私钥,并使用C/C解密该密钥也可以。但不是相反:我想用PHP解密一个用

  • 我试图通过RSA加密字符串。我也有java样本,但我不能正确地将其转换为c#。 RSA示例: 这是我在c#中生成的代码,但我的c#代码结果与javaCode结果不同。我的代码怎么了?

  • 如何在Python usomg OpenSSL中执行RSA加密和解密? 我有以下几点:

  • 我想使用带有RSA算法的OpenSSL使用私钥加密文件: 现在,如果我执行解密操作: 此操作需要私钥 我知道我应该使用公钥进行加密,如果我使用私钥,我会得到一个签名。 然而,我想这样做是为了学习。

  • 我一直在搜索,但我似乎找不到一个简单的方法解密使用RSA。 我生成了一个公钥和私钥,它们存储在两个单独的文件中,并且是XML格式的。使用FromXmlString将公钥关联到RSACryptoServiceProvider对象,然后加密一个字符串,这一点没有问题。当我试图解密一个加密的字符串时,我的困惑就来了。我不确定如何将私钥数据与RSACryptoServiceProvider关联,以便使用D

  • 我有一个加密的私钥,我知道密码。 我需要用Java库解密它。 不过,我不想使用BouncyCastle,除非没有其他选择。根据之前的经验,变更太多,文档不足。 私钥的格式如下: 我相信密钥数据是Base64编码的,因为我在64个字符后看到。 我尝试了以下方法来解密密钥: 我得到这个例外 我是否将正确的参数传递给构造函数? 我怎样才能做到这一点? 我尝试了Ericsonn的建议,有一个小的变化,因为