2014-09-06 63 views
-2

您好我只是想加密的字符串,但我想扭转解密方法来创建恰好加密的密钥创建加密使用字符串

解密是

public string newSample(string s) 
{ 
    byte[] buffer = Convert.FromBase64String(s); 
    Encoding utF8 = Encoding.UTF8; 
    byte[] bytes1 = utF8.GetBytes("key1"); 
    byte[] bytes2 = utF8.GetBytes("key2"); 
    RijndaelManaged rijndaelManaged1 = new RijndaelManaged(); 
    rijndaelManaged1.Mode = CipherMode.CBC; 
    rijndaelManaged1.Padding = PaddingMode.Zeros; 
    rijndaelManaged1.BlockSize = 128; 
    rijndaelManaged1.KeySize = 128; 
    RijndaelManaged rijndaelManaged2 = rijndaelManaged1; 
    ICryptoTransform transform = (ICryptoTransform)null; 

    transform = rijndaelManaged2.CreateDecryptor(bytes2, bytes1); 
    byte[] bytes3 = (byte[])null; 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, transform, CryptoStreamMode.Write)) 
     { 
      cryptoStream.Write(buffer, 0, buffer.GetLength(0)); 
      cryptoStream.FlushFinalBlock(); 
     } 
     rijndaelManaged2.Clear(); 
     bytes3 = memoryStream.ToArray(); 
    } 
    return new string(Encoding.UTF8.GetChars(bytes3)); 
} 

,才有可能扭转码并创建加密密钥?如果是的话 加密应该看起来像这个解密方法?

感谢

+0

我建议抛出这个代码路程,由[jbtule的回答(http://stackoverflow.com/a/10366194/445517)取代它的相关的问题。不像你的代码,它实际上是安全的。 – CodesInChaos 2014-09-06 19:42:44

+0

感谢链接CodesInChaos但我去与此代码为某种原因cheerz – Gayan 2014-09-06 19:53:13

+0

几个缺陷:1)无MAC =>通过主动攻击2)否IV断裂,泄漏共同前缀3)零填充是不可逆的4 )密钥应该是二进制的,而不是文本5)正如jon所说,你不能使用UTF8作为密文。 – CodesInChaos 2014-09-06 20:43:29

回答

1

这就是问题 - 或至少初始问题:

return new string(Encoding.UTF8.GetChars(bytes3)); 

的加密结果被一个UTF-8编码的字节数组...它的任意字节。通过假设它是有效的UTF-8编码文本,您将丢失信息。

相反,您应该使用十六进制或base64方法,这两种方法都旨在将任意二进制数据以无损方式转换为文本。例如:

return Convert.ToBase64String(bytes3); 

现在,您的解密代码应该这样开始:

byte[] encryptedData = Convert.FromBase64String(base64EncryptedText); 

(其中base64EncryptedText是从你的加密方法的返回值)

从那里,它应该是一个只是扭转每一步的问题,并且有很多例子。您可能会发现由于填充模式而出现问题,但是 - 您可能需要分别记录原始数据的长度。

另外,还不清楚为什么你的方法首先需要一个字符串。加密方法采用base64编码的数据是很奇怪的。这是更常见的是把它使用类似Encoding.UTF8转换成字节,或者为它取一个byte[]开始与任何一个正常的纯文本字符串。

+0

Jon Skeet非常感谢你,这是最初的问题。现在代码正好按照我需要的方式工作,再次感谢你 – Gayan 2014-09-06 19:44:32