使用TDES加密和解密时的数据不正确 [英] Bad Data when Encrypt and Decrypt with TDES

查看:207
本文介绍了使用TDES加密和解密时的数据不正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用TDES加密大字符串并尝试解密它。不明白什么是错的。
当解密中的READ函数从加密异常中得到坏数据时。 (我用注释标记行)



生成和加密字符串:

  public void MssGenerateKeyPair(string ssSymmetricKey,out string ssCipheredKeyPair,out string ssPublicKey){
ssCipheredKeyPair = string.Empty;
ssPublicKey = string.Empty;

//对称密钥是用户签名密码的哈希值
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
byte [] tempKey = sha1.ComputeHash(Encoding.UTF8.GetBytes(ssSymmetricKey));
byte [] key = new byte [24];
tempKey.CopyTo(key,0);
//如果对称密钥为< 24
for(int index = 0,i = tempKey.Length; i< key.Length; index ++,i ++)
{
key [i] = tempKey [index];
}

//定义对称加密数据
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.IV =新字节[8];
tdes.Mode = CipherMode.CBC;
tdes.Padding = PaddingMode.PKCS7;

// define assymetric stuff
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream,tdes.CreateEncryptor(),CryptoStreamMode.Write);
byte [] toChipher = Encoding.UTF8.GetBytes(rsa.ToXmlString(true));
cryptoStream.Write(toChipher,0,toChipher.Length);
byte [] cipheredKeyPair = memoryStream.ToArray();
ssCipheredKeyPair = Convert.ToBase64String(cipheredKeyPair);
ssPublicKey = rsa.ToXmlString(false);
cryptoStream.Close();
memoryStream.Close();


} // MssGenerateKeyPair

解密字符串

  public void MssSignData(string ssSymmetricKey,byte [] ssDataToSign,byte [] ssCipheredKeyPair,out byte [] ssSignature,out byte [] ssSignedData){
ssSignature = new byte [] {};
ssSignedData = new byte [] {};

//对称密钥是用户签名密码的哈希值
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
byte [] tempKey = sha1.ComputeHash(Encoding.UTF8.GetBytes(ssSymmetricKey));
byte [] key = new byte [24];
tempKey.CopyTo(key,0);
//如果对称密钥为< 24
for(int index = 0,i = tempKey.Length; i< key.Length; index ++,i ++)
{
key [i] = tempKey [index];
}

//定义对称加密数据
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.IV =新字节[8];
tdes.Mode = CipherMode.CBC;
tdes.Padding = PaddingMode.PKCS7;

MemoryStream memoryStream = new MemoryStream(ssCipheredKeyPair);
CryptoStream cryptoStream = new CryptoStream(memoryStream,tdes.CreateDecryptor(),CryptoStreamMode.Read);
MemoryStream plainMemoryStream = new MemoryStream();

byte [] tempPlainBytes = new byte [1024];

int read = 0;
int totalRead = 0;
do
{
// ################################# ##############################
//以下命令中的错误
// ### ################################################## ###########
read = cryptoStream.Read(tempPlainBytes,0,tempPlainBytes.Length);
totalRead + = read;
plainMemoryStream.Write(tempPlainBytes,0,read);
} while(read> 0);

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(Encoding.UTF8.GetString(plainMemoryStream.ToArray()));

ssSignature = rsa.SignData(ssDataToSign,new SHA1CryptoServiceProvider());
ssSignedData = ssDataToSign;
cryptoStream.Close();
memoryStream.Close();
plainMemoryStream.Close();

} // MssSignData

要测试的代码

  private void button1_Click(object sender,EventArgs e)
{
string key;
string pkey;
byte [] sig;
byte [] avs;

OutSystems.NssPseudoCertificates.CssPseudoCertificates c = new OutSystems.NssPseudoCertificates.CssPseudoCertificates();

c.MssGenerateKeyPair(xpto,out key,out pkey);
c.MssSignString(xpto,hello,key,out sig,out avs);


}


解决方案

p>像Marvin Smit在他的评论中说的:添加齐平,我做了,工作!
积分转到他!


I'm encrypting a big string with TDES and trying to decrypt it. Can't understand what's is wrong. When it does the READ function in decryption I get "Bad Data" from the Cryptographic Exception. (I marked the line with comments)

To generate and encrypt the string:

public void MssGenerateKeyPair(string ssSymmetricKey, out string ssCipheredKeyPair, out string ssPublicKey) {
        ssCipheredKeyPair = string.Empty;
        ssPublicKey = string.Empty;

        //Symmetric key is the hash of user's signing password
        SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
        byte[] tempKey = sha1.ComputeHash(Encoding.UTF8.GetBytes(ssSymmetricKey));
        byte[] key = new byte[24];
        tempKey.CopyTo(key, 0);
        //if symmetric keys is < 24
        for (int index = 0, i = tempKey.Length; i < key.Length; index++, i++)
        {
            key[i] = tempKey[index];
        }

        //define symmetric encryption data
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = key;
        tdes.IV = new byte[8];
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.PKCS7;

        //define assymetric stuff
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream, tdes.CreateEncryptor(), CryptoStreamMode.Write);
        byte[] toChipher = Encoding.UTF8.GetBytes(rsa.ToXmlString(true));
        cryptoStream.Write(toChipher, 0, toChipher.Length);
        byte[] cipheredKeyPair = memoryStream.ToArray();
        ssCipheredKeyPair = Convert.ToBase64String(cipheredKeyPair);
        ssPublicKey = rsa.ToXmlString(false);
        cryptoStream.Close();
        memoryStream.Close();


    } // MssGenerateKeyPair

To decrypt the string

public void MssSignData(string ssSymmetricKey, byte[] ssDataToSign, byte[] ssCipheredKeyPair, out byte[] ssSignature, out byte[] ssSignedData) {
        ssSignature = new byte[] {};
        ssSignedData = new byte[] {};

        //Symmetric key is the hash of user's signing password
        SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
        byte[] tempKey = sha1.ComputeHash(Encoding.UTF8.GetBytes(ssSymmetricKey));
        byte[] key = new byte[24];
        tempKey.CopyTo(key, 0);
        //if symmetric keys is < 24
        for (int index = 0, i = tempKey.Length; i < key.Length; index++, i++)
        {
            key[i] = tempKey[index];
        }

        //define symmetric encryption data
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = key;
        tdes.IV = new byte[8];
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.PKCS7;

        MemoryStream memoryStream = new MemoryStream(ssCipheredKeyPair);
        CryptoStream cryptoStream = new CryptoStream(memoryStream, tdes.CreateDecryptor(), CryptoStreamMode.Read);
        MemoryStream plainMemoryStream = new MemoryStream();

        byte[] tempPlainBytes = new byte[1024];

        int read = 0;
        int totalRead = 0;
        do
        {
            //################################################################
            //ERROR IN THE FOLLOWING LINE
            //################################################################
            read = cryptoStream.Read(tempPlainBytes, 0, tempPlainBytes.Length);
            totalRead += read;
            plainMemoryStream.Write(tempPlainBytes, 0, read);
        } while (read > 0);

        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.FromXmlString(Encoding.UTF8.GetString(plainMemoryStream.ToArray()));

        ssSignature = rsa.SignData(ssDataToSign, new SHA1CryptoServiceProvider());
        ssSignedData = ssDataToSign;
        cryptoStream.Close();
        memoryStream.Close();
        plainMemoryStream.Close();

    } // MssSignData

Code to test

 private void button1_Click(object sender, EventArgs e)
    {
        string key;
        string pkey;
        byte[] sig;
        byte[] avs;

        OutSystems.NssPseudoCertificates.CssPseudoCertificates c = new OutSystems.NssPseudoCertificates.CssPseudoCertificates();

        c.MssGenerateKeyPair("xpto",out key, out pkey);
        c.MssSignString("xpto", "hello", key, out sig, out avs);


    }

解决方案

Like Marvin Smit said in his comments: to add the flush, I did it and worked! Credits go to him!

这篇关于使用TDES加密和解密时的数据不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆