c# – Java中的TripleDESCryptoServiceProvider等效项
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Java中的TripleDESCryptoServiceProvider等效项,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3484字,纯文字阅读大概需要5分钟。
内容图文
![c# – Java中的TripleDESCryptoServiceProvider等效项](/upload/InfoBanner/zyjiaocheng/751/975819d38bcf4b8bbdd90de1dc72a5eb.jpg)
拜托,请不要问我为什么.我只是在.NET中使用此代码来加密/解密数据字符串.我现在需要在java中制作“完全”相同的功能.我已经尝试了几个DESede crypt的例子,但是它们都没有给出与.net中这个类相同的结果.
我甚至在ssl后面制作一个.net webserbvice来服务于.net写的这两种方法,但是如果不用尽所有可能性就太愚蠢了.
也许你们中的一些在这个领域更有相关性的java人将会在你的头脑中如何制作它.
谢谢 !!!
public class Encryption
{
private static byte[] sharedkey = {...};
private static byte[] sharedvector = {...};
public static String Decrypt(String val)
{
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
byte[] toDecrypt = Convert.FromBase64String(val);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, tdes.CreateDecryptor( sharedkey, sharedvector ), CryptoStreamMode.Write);
cs.Write(toDecrypt, 0, toDecrypt.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
public static String Encrypt(String val)
{
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
byte[] toEncrypt = Encoding.UTF8.GetBytes(val);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, tdes.CreateEncryptor( sharedkey, sharedvector ), CryptoStreamMode.Write);
cs.Write(toEncrypt, 0, toEncrypt.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
Samle输入/输出
String plain = "userNameHere:passwordHere";
Console.WriteLine("plain: " + plain);
String encrypted = Encrypt(plain);
Console.WriteLine("encrypted: " + encrypted);
// "zQPZgQHpjxR+41Bc6+2Bvqo7+pQAxBBVN+0V1tRXcOc="
String decripted = Decrypt(encrypted);
Console.WriteLine("decripted: " + decripted);
// "userNameHere:passwordHere"
解决方法:
代码如下,但首先是几个注释.
>必须为每条消息选择不同的初始化向量.硬编码初始化向量没有意义. IV应与密文一起发送给消息接收者(这不是秘密).
>我使用自己的实用程序类进行base-64编码.您可以使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder,使用像BouncyCastle这样的第三方库,或者编写自己的库.
>您正在使用双键三重DES,其中第一个键和第三个键相同.我修改了sharedkey以反映这一点,因为Java DESede密码总是需要192位密钥;由键生成器来处理键控选项.
> CBC IV只有64位.我只使用了共享向量的前64位.
该类应与C#版本互操作.
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Encryption
{
private static byte[] sharedkey = {
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11,
0x12, 0x11, 0x0D, 0x0B, 0x07, 0x02, 0x04, 0x08,
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
};
private static byte[] sharedvector = {
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
};
public static void main(String... argv)
throws Exception
{
String plaintext = "userNameHere:passwordHere";
String ciphertext = encrypt(plaintext);
System.out.println(ciphertext);
System.out.println(decrypt(ciphertext));
}
public static String encrypt(String plaintext)
throws Exception
{
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
byte[] encrypted = c.doFinal(plaintext.getBytes("UTF-8"));
return Base64.encode(encrypted);
}
public static String decrypt(String ciphertext)
throws Exception
{
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
byte[] decrypted = c.doFinal(Base64.decode(ciphertext));
return new String(decrypted, "UTF-8");
}
}
输出:
zQPZgQHpjxR+41Bc6+2Bvqo7+pQAxBBVN+0V1tRXcOc=
userNameHere:passwordHere
内容总结
以上是互联网集市为您收集整理的c# – Java中的TripleDESCryptoServiceProvider等效项全部内容,希望文章能够帮你解决c# – Java中的TripleDESCryptoServiceProvider等效项所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。