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

用私钥c加密RSA#

百里文景
2023-03-14

我试图通过RSA加密字符串。我也有java样本,但我不能正确地将其转换为c#。

RSA示例:

public static String RSA_Sign(String preparedStr, String secretKey) {
        try {
            PrivateKey priKey = getPrivateKey(secretKey);
            Signature signature = Signature.getInstance("SHA256WithRSA");
            signature.initSign(priKey);
            signature.update(content.getBytes(CharEncoding.UTF_8));
            byte[] signed = signature.sign();
            return new String(Base64.getEncoder().encode(signed));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static PrivateKey getPrivateKey(String key) {
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(key));
        PrivateKey privateKey = null;
        try {
            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            privateKey = keyFactory.generatePrivate(keySpec);
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return privateKey;
    }

这是我在c#中生成的代码,但我的c#代码结果与javaCode结果不同。我的代码怎么了?

 public string GetRSA0(string input, string pkey)
    {
        var publicKey = $"<RSAKeyValue><Modulus>{pkey}</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

        var testData = Encoding.UTF8.GetBytes(input);

        using (var rsa = new RSACryptoServiceProvider(1024))
        {
            try
            {
                // client encrypting data with public key issued by server                    
                rsa.FromXmlString(publicKey.ToString());

                var encryptedData = rsa.Encrypt(testData, true);

                var base64Encrypted = Convert.ToBase64String(encryptedData);

                return base64Encrypted;
            }
            finally
            {
                rsa.PersistKeyInCsp = false;
            }
        }

    }

共有1个答案

路思源
2023-03-14

可以使用以下类来执行此操作:

public class RSATool
{
    public string Encrypt(string strText, string strPublicKey)
    {
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.FromXmlString(strPublicKey);

        byte[] byteText = Encoding.UTF8.GetBytes(strText);
        byte[] byteEntry = rsa.Encrypt(byteText, false);

        return Convert.ToBase64String(byteEntry);
    }


    public string Decrypt(string strEntryText,string strPrivateKey)
    {
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.FromXmlString(strPrivateKey);

        byte[] byteEntry = Convert.FromBase64String(strEntryText);
        byte[] byteText = rsa.Decrypt(byteEntry, false);

        return Encoding.UTF8.GetString(byteText);
    }

    public Dictionary GetKey()
    {
        Dictionary dictKey = new Dictionary();
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

        dictKey.Add("PublicKey", rsa.ToXmlString(false));
        dictKey.Add("PrivateKey", rsa.ToXmlString(true));

        return dictKey;
    }
}

你可以使用它如下

        RSATool myRSA = new RSATool();
        Dictionary dictK = new Dictionary();
        dictK = myRSA.GetKey();

        string strText = "123456";
        Console.writeline (" string to encrypt: {0}", strText);

        string str1 = myRSA.Encrypt("123456", dictK["PublicKey"]);
        Console.WriteLine(" encrypted string: {0}", str1);

        string str2 = myRSA.Decrypt(str1, dictK["PrivateKey"]);
        Console.WriteLine(" decrypted string: {0}", str2);
 类似资料:
  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 并且我将这个函数称为用RSA公钥加密DSA密钥的函数:

  • 我找到了几个可以使用的解决方案。Net RSA Provider使用公钥对消息进行加密,并使用私钥对其解密。 但我想要的是用私钥加密,用公钥解密。 我希望在我的应用程序中存储公钥,并使用私钥加密许可证,例如在我的开发人员计算机上,将其发送到应用程序,并让信息使用公钥解密。 我怎样才能做到这一点?

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

  • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起

  • 为了更新一些证书,我必须将jks密钥库转换为PKCS#12密钥库,并在转换过程中包含私钥。我们收到的密钥库是JKS密钥库,但是我们的网络服务器使用PKCS#12密钥库,我们收到的密钥库只包含证书,而不包含私钥。 我试着用谷歌搜索并阅读SO的几个条目,我只想出了一个解决方案,这似乎更像是一个变通方法,而不是一个好的方法,所以我想知道是否有人有更好的方法如何注入私钥,并以更简单的方式从jks密钥库转换