2010-12-20 65 views
2

我在Visual Basic中有一个加密的字符串。 NET 2008年,加密和解密功能如下:等价于Java中的CryptoStream .NET?

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 

例如单词“机器人”这个函数加密给我结果“B3xogi/Qfsc =”

现在我需要解密字符串“B3xogi/Qfsc =”它来自java,由相同的键,这是“key12345”,结果应该是“android”...任何人都知道如何做到这一点?

在此先感谢。

+0

编辑我的帖子,阅读第二一篇文章,可能对你更有用,它的例子是好了很多,看着你的问题:) – LaGrandMere 2010-12-20 13:30:53

回答

4

使用Apache共享编解码器十六进制和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")); 
+0

感谢时,我下载了类“阿帕奇共享编解码器”,但在line Base64.decodeBase64(B3xogi/Qfsc =“)会引发InvocationTargetException错误”java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64。 decodeBase64 – seba123neo 2010-12-20 19:21:56

+0

也许你应该在尝试更困难的事情之前学习一些Java基础知识?你显然是用不同版本的Commons Codec编译和运行代码(使用旧版本运行,其中decodeBase64方法尚未实现)。 – jarnbjo 2010-12-20 22:12:28

+0

我下载了最新版本的Commons Codec 1.4,链接是: http://commons.apache.org/codec/download_codec.cgi – seba123neo 2010-12-21 00:51:10

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