使用相同容器的不同加密值

Posted

技术标签:

【中文标题】使用相同容器的不同加密值【英文标题】:Different values on encryption using the same container 【发布时间】:2013-12-16 14:37:07 【问题描述】:

我在同一个解决方案中有 2 个项目,在一个项目中我使用 SignData 加密消息,在另一个项目中我正在重新创建在第一个项目中加密的消息并比较结果以查看它们是否相同。但是第一个项目的加密返回的值与第二个项目的加密不同。如果我在两个项目中给出相同的字节数组,我怎么能得到相同的返回值。我认为RSA 生成 2 个不同的密钥,但我使用相同的容器

param.KeyContainerName = "SignatureContainer101";

有什么方法可以在不传递任何密钥的情况下做到这一点?我需要它在同一台机器上本地运行。或者我可以做些什么来获得相同的结果的任何其他建议? 这是我正在使用的代码:

public static byte[] SignData(byte[] message)
    

        //convert data to be signed in a byte array
        byte[] byteSignature2;

        CspParameters param = new CspParameters();
        //Giving container a name, so we can use the same keys for verifying data.
        param.KeyContainerName = "SignatureContainer101";

        //Initializing RSACryptoServiceProvider
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
        
            //We want RSACryptoServiceProvider to save keys in keystore
            //because we want to keep signature generation routine seperate
            //from verifying data against signature.
            rsa.PersistKeyInCsp = true;
            byte[] byteSignature = rsa.SignData(message, "SHA256");
            byteSignature2 = new byte[byteSignature.Length];
            byteSignature2 = byteSignature;



        
        return byteSignature2;
    
    public static bool VerifyData(byte[] originalMessage, byte[] signedMessage)
    

        bool isSuccess = false;

        CspParameters param = new CspParameters();
        //Utilizing the same key container which was created during
        //signature generation process i.e. in GetDataSignature(string data) function.
        //If we don't utilize the same keycontainer, VerifyData will always return false
        //because RSACryptoSeriveProvider initialization will generate new keys.
        param.KeyContainerName = "SignatureContainer101";

        //Initializing RSACryptoServiceProvider
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
        

            //verifying data against signature
            isSuccess = rsa.VerifyData(originalMessage, "SHA256", signedMessage);
        
        return isSuccess;
    

【问题讨论】:

【参考方案1】:

我不确定到底是什么问题。

如果我在两个项目中给出相同的字节数组,我该如何做才能得到相同的返回值。

您是否希望SignData 在使用相同密钥对相同消息调用两次时返回完全相同相同的字节?它不会而且它不应该。每次完成“相同”的非对称(公钥)加密/签名时,它都应该有一个不同的结果。这是使用该过程中使用的随机填充来实现的。之所以需要它,是因为在公钥密码学中,其中一个密钥是 public,如果不使用随机性,它会使密码学属性变弱。 (有关更多信息,请参阅例如this answer on Security SE。)

所以,你不应该逐字节比较结果,你应该使用VerifyData方法来检查签名是否正确,而不是是否相同 em>。

【讨论】:

这就是我想要做的,我从第一个项目中获取签名并将其与重新创建的用于签名的消息进行比较,但验证失败...... 您是否在与用于签署消息的用户帐户相同的用户帐户下(在同一台机器上)运行验证?【参考方案2】:

我发现你的代码没有问题。有用!这就是我所做的:

public partial class Program

    protected override void Execute()
    
        var message1 = Encoding.UTF8.GetBytes("Hello there,");
        var message2 = Encoding.UTF8.GetBytes("Hello there");
        var signed = SignData(message1);
        var notOK = VerifyData(message2, signed);
        var oK = VerifyData(message1, signed);
    

    public static byte[] SignData(byte[] message)
    
        byte[] byteSignature2;

        var param = new CspParameters
                    
                        KeyContainerName = "SignatureContainer101"
                    ;
        using (var rsa = new RSACryptoServiceProvider(param))
        
            rsa.PersistKeyInCsp = true;
            var byteSignature = rsa.SignData(message, "SHA256");
            byteSignature2 = byteSignature;
        
        return byteSignature2;
    
    public static bool VerifyData(byte[] originalMessage, byte[] signedMessage)
    
        bool isSuccess;

        var param = new CspParameters
                    
                        KeyContainerName = "SignatureContainer101"
                    ;
        using (var rsa = new RSACryptoServiceProvider(param))
            isSuccess = rsa.VerifyData(originalMessage, "SHA256", signedMessage);
        return isSuccess;
    

【讨论】:

当我在同一个项目中验证数据时它可以工作,但是当我在另一个项目中验证它时它不起作用,它返回 false

以上是关于使用相同容器的不同加密值的主要内容,如果未能解决你的问题,请参考以下文章

加密算法在linux下相同输入每次加密结果都不同的问题

C#中的SHA1哈希值是否会永远返回给定字符串的相同值?

在 Android 和 iPhone 中使用 AES-128 加密(不同的结果)

单向散列加密

Java AES 128 加密方式与 openssl 不同

Android常见的加密算法