使用同一容器加密时的不同值

本文关键字:加密 | 更新日期: 2024-10-22 06:12:47

我在同一个解决方案中有两个项目,在一个项目中,我使用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;
    }
}

使用同一容器加密时的不同值

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

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

当使用相同的密钥对相同的消息调用两次时,您希望SignData返回完全相同的字节吗?它不会,也不应该。每次进行"相同"的非对称(公钥)加密/签名时,都会产生不同的结果。这是通过使用过程中使用的一段随机填充来实现的。之所以需要它,是因为在公钥密码学中,其中一个密钥是public,如果不使用随机性,则会使加密属性变弱。(有关更多信息,请参阅Security SE上的回答。)

因此,您不应该逐字节比较结果,您应该使用VerifyData方法来检查签名是否正确,而不是是否相同

我在您的代码中没有发现任何问题。它有效!这就是我所做的:

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;
    }
}