在Java中加密并在C#中解密并反向

时间:2011-10-22 08:23:31

标签: bouncycastle encryption

我已经阅读了我的标题的一些主题,所以我不能用它们来解决我的问题。所以,我打开一个新话题...... 我想在java(对于Android应用程序)和C#(我的服务器)中使用对称加密创建2个函数Encrypt and Decrypt

客户端(java):加密(ClearText1,密钥)=秘密 - >服务器:解密(secret,Key)= ClearText1 和 服务器(java):加密(ClearText2,密钥)=秘密 - >客户端:解密(secret,Key)= ClearText2

我使用过BouncyCastle Library对于java和C#,但是java中的字节是-128..127,而C#中的字节是0..255,没有负数据。因此客户端和服务器加密和解密失败。

请帮助我(或者为我的问题分享我的图书馆)。谢谢!

这里是C#中的代码: 如何在java中使用它们?注意C#中的数据类型“byte”与java不匹配 (当然,使用以下2个函数加密和解密数据是正确的)

>     public string _secretPhrase = "123abc456";
>     public string EncryptData(string plainText)
>     {
>         DES des = new DESCryptoServiceProvider();
>         des.Mode = CipherMode.ECB;
>         des.Padding = PaddingMode.PKCS7;
> 
>         des.Key = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
>         des.IV = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
> 
>         byte[] bytes = Encoding.UTF8.GetBytes(plainText);
>         byte[] resultBytes = des.CreateEncryptor().TransformFinalBlock(bytes, 0, bytes.Length);
> 
>         return Convert.ToBase64String(resultBytes);
>     }
> 
>     public string DecryptData(string encryptedText)
>     {
>         DES des = new DESCryptoServiceProvider();
>         des.Mode = CipherMode.ECB;
>         des.Padding = PaddingMode.PKCS7;
>         des.Key = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
>         des.IV = System.Text.Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
> 
>         byte[] bytes = Convert.FromBase64String(encryptedText);
>         byte[] resultBytes = des.CreateDecryptor().TransformFinalBlock(bytes, 0, bytes.Length);
> 
>         return Encoding.UTF8.GetString(resultBytes);
>     }

1 个答案:

答案 0 :(得分:0)

看起来你没有使用BouncyCastle。这看起来像股票.NET Framework加密代码。 BouncyCastle使用像DesEngine这样的命名约定。

我建议您尝试对C#Java使用BouncyCastle。我不相信字节差异将是一个实际问题。图书馆应该正确地解释它。

此外,单个DES现在被认为非常弱。在合理的硬件上有single day attacks反对它,它不再是批准的标准。再看看AES。

最后,我不确定使用相同的密钥和IV是明智的。我不是加密专家,但使用两个不同的随机数应该更安全。