Bob和Alice非对称加解密实现

Posted

技术标签:

【中文标题】Bob和Alice非对称加解密实现【英文标题】:Bob and Alice asymmetric encryption and decryption implementation 【发布时间】:2021-06-11 12:39:19 【问题描述】:

我正在尝试使用RSACryptoServiceProvider 构建 Bob 和 Alice 的非对称加密和解密实现

因为我有

    控制台应用 Bob(可以视为发件人) 控制台应用程序 Alice(可以视为接收方)

控制台应用 Bob 可以使用其公钥加密,然后控制台应用 Alice 可以使用其私钥解密

所以这是 Bob 控制台应用程序

    class Program
    
        static void Main(string[] args)
        
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();  

            string publicKey = rsa.ToXmlString(false); 
            string privateKey = rsa.ToXmlString(true); 

            EncryptText(publicKey, "Hello from C# Corner", "encryptedData.dat");
        

        public static void EncryptText(string publicKey, string text, string fileName)
        
            UnicodeEncoding byteConverter = new UnicodeEncoding();
            byte[] dataToEncrypt = byteConverter.GetBytes(text);
            byte[] encryptedData;
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            
                rsa.FromXmlString(publicKey);
                encryptedData = rsa.Encrypt(dataToEncrypt, false);
             
            File.WriteAllBytes(fileName, encryptedData);  
            Console.WriteLine("Data has been encrypted");
        
    

这是 Alice 控制台应用

class Program

    static void Main(string[] args)
    
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();  
        string publicKey = rsa.ToXmlString(false);  
        string privateKey = rsa.ToXmlString(true);     
     
        Console.WriteLine("Decrypted message: 0", DecryptData(privateKey, "encryptedData.dat"));
    

    public static string DecryptData(string privateKey, string fileName)
    

        byte[] dataToDecrypt = File.ReadAllBytes(fileName);
        byte[] decryptedData;
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        
            rsa.FromXmlString(privateKey);
            decryptedData = rsa.Decrypt(dataToDecrypt, false);
        
        UnicodeEncoding byteConverter = new UnicodeEncoding();
        return byteConverter.GetString(decryptedData);
    

当它在解密时,我得到的错误是

System.Security.Cryptography.CryptographicException: '参数是 不正确。

您能否就此提出建议:)

【问题讨论】:

@LasseV.Karlsen,如果这些都在一个应用程序下没有问题 【参考方案1】:

这里的原因是您在两个应用程序中都构建了一个公钥/私钥对。

本质上,您是在尝试使用 Bob 的公钥加密某些内容,并尝试使用 Alice 的私钥对其进行解密。这行不通。

您需要构造1对,然后使用该对中的公钥进行加密,使用同一对中的私钥进行解密。

这行得通:

void Main()

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    string publicKey = rsa.ToXmlString(false);
    string privateKey = rsa.ToXmlString(true);
    
    EncryptText(publicKey, "Test", @"d:\temp\test.dat");
    Console.WriteLine(DecryptData(privateKey, @"d:\temp\test.dat"));

但如果我在调用解密之前创建一个新对,我会收到此错误:

WindowsCryptographicException 参数不正确。

【讨论】:

如何在一个应用程序中使用此加密方法并在另一个应用程序中使用解密方法 那么您需要将公钥共享给进行加密的应用程序。 通过写入文件正确吗?第一次生成密钥对时 类似的东西,是的。将公钥提供给加密应用程序。

以上是关于Bob和Alice非对称加解密实现的主要内容,如果未能解决你的问题,请参考以下文章

Go-加密学 - 非对称加密

Go-加密学 - 非对称加密

Hello,密码学:第三部分,公钥密码(非对称密码)算法

TLS过程(DH 非对称加密)

Web信息安全实践_1.6 RSA

对称加密和非对称加密