2012-06-30 178 views
2

我有一个关于加密和解密的字符串问题加密和解密字符串

我必须通过网络发送一个加密的字符串。(Android应用程序是客户端),这是我做了什么至今

byte[] input = getByteArray(filePath);//get the message stored in a file as a byte array 

通过一些教程去我设法字符串消息以一个字节数组和 使用javax.crypto中

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 

加密毫秒加密它g的retrived作为一个字节数组

byte[] encrypted 

我甚至管理使用反向方法对其进行解密,并得到消息再次

但我的问题是当我尝试将这个加密的字节数组,字符串(以通过它在网络上) ,然后将其重新转换为一个字节数组

我tryed此

String encryptedStrn = new String(encrypted); // convert to string 

当我将其转换为字节数组由 byte [] enc = encryptedStrn.getBytes();

,并使用此ENC阵列解密,但输出不正确地执行了。

我错过了关于把一些基本的东西。请帮帮我。 在此先感谢

+1

请勿使用'encryptedStrn.getBytes()'。使用Base64编码。 – CodesInChaos

+0

DES也相当薄弱。改用AES。 – CodesInChaos

+0

@CodeInChaos我在将字节转换为字符串时遇到了问题。 –

回答

4

由于CodeInChaos在评论中写道,您不应该使用String(byte[])构造函数从不透明的二进制数据创建字符串。字符串的构造旨在用于已经使用类似ASCII的编码编码文本数据,UTF-8等不透明的二进制数据,例如加密,或图像文件的结果,是不同一编码文本数据方式,所以你最终失去了信息。

您应该使用base64代替,它将任意二进制数据编码为ASCII。有各种各样的第三方库,包括一个好的public domain one。另外,在Android上,您可以使用Base64类。

此外,甚至当你编码或解码真正的文字,你不应该使用String.getBytes()String(byte[])构造反正 - 他们所使用的平台默认的编码,这是几乎总是错误的选择。相反,您应该使用明确采用CharSet或字符编码名称的重载。 UTF-8通常是一个很好的编码使用,如果你能控制两端 - 如果你只控制一个结束,你需要知道哪些编码的另一端期待。

+0

感谢您指点我正确的方向。您提供的信息对我非常有用 –

0

你应该使用Base64编码的密文。不要将其转换为字符串。字符串不是二进制数据的容器。

0
public string EncryptUser(string userID) 
    { 
     using (var cryptoProvider = new DESCryptoServiceProvider()) 
     using (var memoryStream = new MemoryStream()) 
     using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(DESKey, DESInitializationVector), CryptoStreamMode.Write)) 
     using (var writer = new StreamWriter(cryptoStream)) 
     { 
      writer.Write(userID); 
      writer.Flush(); 
      cryptoStream.FlushFinalBlock(); 
      writer.Flush(); 
      return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length); 
     } 
    } 


    public string DecryptUserID(string userID) 
    { 
     using (var cryptoProvider = new DESCryptoServiceProvider()) 
     using (var memoryStream = new MemoryStream(Convert.FromBase64String(userID))) 
     using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(DESKey, DESInitializationVector), CryptoStreamMode.Read)) 
     using (var reader = new StreamReader(cryptoStream)) 
     { 
      return reader.ReadToEnd(); 
     } 
    }