.NET中的TripleDESCryptoServiceProvider等效于Java [英] .NET TripleDESCryptoServiceProvider equivalent in Java

查看:123
本文介绍了.NET中的TripleDESCryptoServiceProvider等效于Java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请不要问我为什么。我只是在.NET中加密/解密数据字符串的代码。我现在需要在java中使完全的功能相同。我已经尝试过几个DESede crypt的例子,但是没有一个与.net中的这个类相同的结果。



我即使在.net webserbvice后面为了服务于.net中的这两种方法,但是在没有耗尽所有可能性的情况下,这样做太愚蠢了。



也许你们中有些人在



谢谢!!!

  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);


加密字符串=加密(普通);
Console.WriteLine(encrypted:+ encrypted);
//zQPZgQHpjxR + 41Bc6 + 2Bvqo7 + pQAxBBVN + 0V1tRXcOc =

String decripted = Decrypt(encrypted);
Console.WriteLine(decripted:+ decripted);
//userNameHere:passwordHere


解决方案

代码如下,但首先是几个注释。


  1. 必须为每条消息选择不同的初始化向量。硬编码初始化向量没有意义。 IV应与密文一起发送给消息收件人(这不是秘密的)。

  2. 我使用自己的实用程序类进行base-64编码。您可以使用 sun.misc.BASE64Encoder sun.misc.BASE64Decoder ,使用第三方库,如BouncyCastle或者自己编写。

  3. 您正在使用双键三重DES,其中第一个键和第三个键是相同的。我修改了 sharedkey 来反映这一点,因为Java DESede密码总是需要192位密钥;由密钥生成器来处理密钥选项。

  4. CBC IV只有64位。我只使用了前$ 64 $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $应该与C#版本进行互操作。

      import javax.crypto.Cipher; 
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;

    public class加密
    {

    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异常
    {
    String plaintext =userNameHere:passwordHere;
    String ciphertext = encrypt(plaintext);
    System.out.println(ciphertext);
    System.out.println(decrypt(ciphertext));


    public static String encrypt(String plaintext)
    throws异常
    {
    Cipher c = Cipher.getInstance(DESede / CBC / PKCS5Padding );
    c.init(Cipher.ENCRYPT_MODE,新的SecretKeySpec(sharedkey,DESede),新的IvParameterSpec(sharedvector));
    byte [] encrypted = c.doFinal(plaintext.getBytes(UTF-8));
    返回Base64.encode(加密);
    }

    public static String decrypt(String ciphertext)
    throws异常
    {
    密码c = Cipher.getInstance(DESede / CBC / PKCS5Padding );
    c.init(Cipher.DECRYPT_MODE,新的SecretKeySpec(sharedkey,DESede),新的IvParameterSpec(sharedvector));
    byte [] decryptpted = c.doFinal(Base64.decode(ciphertext));
    return new String(解密,UTF-8);
    }

    }

    输出:


    zQPZgQHpjxR + 41Bc6 + 2Bvqo7 + pQAxBBVN + 0V1tRXcOc =



    userNameHere:passwordHere



    Please, just don't ask me why. I just have this code in .NET that encrypt/decrypt strings of data. I need now to make 'exactly' the same funcionality in java. I have tried several examples for DESede crypt, but none of them gives the same results as this class in .net.

    I even though on making a .net webserbvice behind ssl to serve this two methods writen in .net but it is just too stupid to do without exhausting all the posibilities.

    Maybe some of you java people which are more related in the area will have on top of your heads how to make it.

    Thanks !!!

    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 input/output

    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"
    

    解决方案

    Code follows, but first a few notes.

    1. A different initialization vector must be chosen for every message. Hard-coding the initialization vector does not make sense. The IV should be sent along with the cipher text to the message recipient (it's not secret).
    2. I used my own utility class for base-64 encoding. You can use sun.misc.BASE64Encoder and sun.misc.BASE64Decoder instead, use a third-party library like BouncyCastle, or write your own.
    3. You are using 2-key triple DES, where the first key and the third key is the same. I modified sharedkey to reflect this, since the Java DESede cipher always requires a 192-bit key; it's up to the key generator to handle the keying option.
    4. A CBC IV is only 64 bits. I've used only the first 64 bits of sharedvector.

    This class should inter-operate with the C# version.

    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");
      }
    
    }
    

    Output:

    zQPZgQHpjxR+41Bc6+2Bvqo7+pQAxBBVN+0V1tRXcOc=

    userNameHere:passwordHere

    这篇关于.NET中的TripleDESCryptoServiceProvider等效于Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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