-5

我有这个 vb.net 代码(但我认为含义代码也与 c# 等效),我必须在 Java 中复制它并且无论如何我都无法修改它(只是复制):

Public Shared Function Encrypt(ByVal plainText As String, Optional key As String = "") As String

    If String.IsNullOrEmpty(key) Then key = "sfdjf48mdfdf3054"

    Dim encrypted As String = Nothing
    Try

        Dim inputBytes As Byte() = ASCIIEncoding.ASCII.GetBytes(plainText)
        Dim pwdhash As Byte() = Nothing

        'generate an MD5 hash from the password.
        'a hash is a one way encryption meaning once you generate
        'the hash, you cant derive the password back from it.
        Dim hashmd5 As New MD5CryptoServiceProvider()
        pwdhash = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))
        hashmd5 = Nothing

        ' Create a new TripleDES service provider
        Dim tdesProvider As New TripleDESCryptoServiceProvider()
        tdesProvider.Key = pwdhash
        tdesProvider.Mode = CipherMode.ECB

        encrypted = Convert.ToBase64String(tdesProvider.CreateEncryptor().TransformFinalBlock(inputBytes, 0, inputBytes.Length))

    Catch e As Exception
        Dim str As String = e.Message
        Throw
    End Try
    Return encrypted
End Function

确切地说,这是一个 .NET 实用程序类函数。

现在,

我不知道如何复制

TripleDESCryptoServiceProvider()

在java代码中我开始写一些代码,但我不知道如何继续:

public static String encrypt(String plaintext, String enctoken){

    if(enctoken == null)
        enctoken = "sfdjf48mdfdf3054";

    String encrypted = null;

    byte[] plaintextByte = EncodingUtils.getAsciiBytes(plaintext);

    //nel caso non funzionasse provare getBytes semplicemente
    byte[] pwd = EncodingUtils.getAsciiBytes(Connessione.md5(enctoken));        

    try {
        Cipher cipher = Cipher.getInstance("DESEDE/ECB/NoPadding");
        SecretKeySpec myKey = new SecretKeySpec(pwd,"DESede");

        cipher.init( Cipher.ENCRYPT_MODE, myKey);

        try {
            byte[] encryptedPlainText= cipher.doFinal(plaintextByte);

            encrypted = Base64.encodeToString(encryptedPlainText, 0); 
            return encrypted;

        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       

    return "";
}

更新:

我刚刚更新了代码。现在应该不错了。Enctoken String 将是一个字符串数据表示(刚刚知道)。这样,只有当第二个参数为 NULL 时才设置固定键

更新 2

不幸的是,c# hash 总是与 Java hash 不同!!如何在java中复制这个??

 Dim hashmd5 As New MD5CryptoServiceProvider()
    pwdhash = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))
    hashmd5 = Nothing

    ' Create a new TripleDES service provider
    Dim tdesProvider As New TripleDESCryptoServiceProvider()
    tdesProvider.Key = pwdhash
    tdesProvider.Mode = CipherMode.ECB

    encrypted = Convert.ToBase64String(tdesProvider.CreateEncryptor().TransformFinalBlock(inputBytes, 0, inputBytes.Length))

我以这种方式尝试过,但它不起作用:

哈希

public static final String md5(byte[] s) { 
    try { 

        MessageDigest m = MessageDigest.getInstance("MD5");
        byte[] digest = m.digest(s);
        String hash = EncodingUtils.getAsciiString(digest, 0, 16);
        Log.i("MD5", "Hash: "+hash);

        return hash;

    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    }
    return "";
}   
4

2 回答 2

4

自己修的!以下函数给出相同的 MD5 HASH 结果:

JAVA哈希MD5

public static final byte[] md5(String s) { 
    try { 

        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] messageDigest = md.digest(s.getBytes("UTF-8"));

        String md5 = EncodingUtils.getString(messageDigest, "UTF-8");

        Log.i("Function MD5", md5);
        Log.i("Function MD5 Length","Length: "+ md5.length());

        return messageDigest;

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    return null;
}   

VB.NET 哈希 MD5

Dim hashmd5 As New MD5CryptoServiceProvider()
pwdhash = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))

而且,TRIPLE-DES ECB JAVA 是

try {
        Cipher cipher = Cipher.getInstance("DESEDE/ECB/PKCS5Padding");
        SecretKeySpec myKey = new SecretKeySpec(hash,"DESede");

        cipher.init(Cipher.ENCRYPT_MODE, myKey);

        try {
            byte[] encryptedPlainText = cipher.doFinal(plaintextByte);

            encrypted = Base64.encodeToString(encryptedPlainText, 0); 
            Log.i("ENCRYPT", "Pwd encrypted: "+encrypted);
            return encrypted;

        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       

TRIPLE-DES VB.NET 是

' Create a new TripleDES service provider
    Dim tdesProvider As New TripleDESCryptoServiceProvider()
    tdesProvider.Key = pwdhash
    tdesProvider.Mode = CipherMode.ECB

    encrypted = Convert.ToBase64String(tdesProvider.CreateEncryptor().TransformFinalBlock(inputBytes, 0, inputBytes.Length))
于 2012-06-21T17:39:54.823 回答
0

ECB 模式没有 IV 之类的东西(这是您的应用程序中不安全的事情之一,您至少应该使用 CBC 模式)。

至于秘钥,你刚刚算了一个,为什么会卡在这里?你得到什么例外?同样,使用 ASCII 字符而不是完整字节是不安全的;它使您容易受到(至少)暴力攻击。

于 2012-06-19T17:57:17.547 回答