相当于Java中的CryptoStream .NET?

时间:2010-12-20 13:11:49

标签: java .net android visual-studio-2008 encryption

我在visual basic中有一个加密的字符串。 NET 2008,加密和解密的功能如下:

Imports System.Security.Cryptography

 Public Shared Function Encriptar(ByVal strValor As String) As String
    Dim strEncrKey As String = "key12345" 
    Dim byKey() As Byte = {}
    Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
    Try
        byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey)
        Dim des As New DESCryptoServiceProvider
        Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(strValor)
        Dim ms As New MemoryStream
        Dim cs As New CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write)
        cs.Write(inputByteArray, 0, inputByteArray.Length)
        cs.FlushFinalBlock()
        Return Convert.ToBase64String(ms.ToArray())
    Catch ex As Exception
        Return ""
    End Try
End Function

Public Shared Function Desencriptar(ByVal strValor As String) As String
    Dim sDecrKey As String = "key12345" 
    Dim byKey() As Byte = {}
    Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
    Dim inputByteArray(strValor.Length) As Byte
    Try
        byKey = System.Text.Encoding.UTF8.GetBytes(sDecrKey)
        Dim des As New DESCryptoServiceProvider
        If Trim(strValor).Length = 0 Then
            Throw New Exception("Password No debe estar en Blanco")
        End If
        inputByteArray = Convert.FromBase64String(strValor)
        Dim ms As New MemoryStream
        Dim cs As New CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write)
        cs.Write(inputByteArray, 0, inputByteArray.Length)
        cs.FlushFinalBlock()
        Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
        Return encoding.GetString(ms.ToArray(), 0, ms.ToArray.Count)
    Catch ex As Exception
        Return ""
    End Try
End Function

例如用这个函数加密的“android”这个词给我的结果是“B3xogi / Qfsc =”

现在我需要从java解密字符串“B3xogi / Qfsc =”,使用相同的密钥,即“key12345”,结果应该是“android”...任何人都知道怎么做?< / p>

提前致谢。

4 个答案:

答案 0 :(得分:5)

使用Apache Commons Codec进行十六进制和base64编码/解码,您可以使用以下代码:

KeySpec ks = new DESKeySpec("key12345".getBytes("UTF-8"));
SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(ks);

IvParameterSpec iv = new IvParameterSpec(
        Hex.decodeHex("1234567890ABCDEF".toCharArray()));

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);

byte[] decoded = cipher.doFinal(Base64.decodeBase64("B3xogi/Qfsc="));

System.out.println("Decoded: " + new String(decoded, "UTF-8"));

答案 1 :(得分:2)

您正在使用DES加密。

以下是有关如何encrypt and decrypt with DES的示例。

重点是使用它创建SecretKeyCipher,然后用它解密你的字符串。

... Mmmh

我发现another article可能最适合您的问题,因为它使用的是IVBytes:)

答案 2 :(得分:2)

public String encryptText(String cipherText) throws Exception {

    String plainKey = "key12345";
    String plainIV = "1234567890ABCDEF";

    KeySpec ks = new  DESKeySpec(plainKey.getBytes(encodingType));
    SecretKey key = SecretKeyFactory.getInstance(keyDes).generateSecret(ks);

    IvParameterSpec iv = new IvParameterSpec(
            org.apache.commons.codec.binary.Hex.decodeHex(plainIV.toCharArray()));

    Cipher cipher = Cipher.getInstance(encryptAlgo);
    cipher.init(Cipher.ENCRYPT_MODE, key, iv);

    byte[] decoded = cipher.doFinal(cipherText.getBytes(encodingType));

    return new Base64().encodeToString(decoded);
}

答案 3 :(得分:0)

与.NET的CryptoStream类最接近的Java类是CipherInputStreamCipherOutputStream类。