.NET 加密的 Java 等价物 - DESCryptoServiceProvider

标签 java .net des encryption-symmetric

美好的一天,我需要使用 base64 编码加密一些文本并将编码后的数据传递给 .NET 应用程序。 .NET 应用程序使用以下形式的编码和解码。我试过这个 Equivalent to CryptoStream .NET in Java? 。 为了这个目的,我在上面的链接之后使用了 Apache commons 编解码器。但坚持使用 cryptoProvider.CreateEncryptor(bytes, bytes) ,当我检查 java 等效项中的第三个参数时 -

Cipher.init(cipher.ENCRYPT_MODE,key,iv)

它必须是一个 IvParameterSpec。我不知道如何解决这个问题。希望得到一些帮助,干杯!

.NET encryption

static byte[] bytes = ASCIIEncoding.ASCII.GetBytes("mykey");
public static string Encrypt(string originalString)
{        
    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream,cryptoProvider.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);
    StreamWriter writer = new StreamWriter(cryptoStream);
    writer.Write(originalString);
    writer.Flush();
    cryptoStream.FlushFinalBlock();
    writer.Flush();
    return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}

等价

Java Encryption

void encrypt(String inputText) throws Exception {
    try {
        String myKey = "mykey";
        byte[] mybyte = str.getBytes("ASCII");
        //String plainIV = "1234567890ABCDEF";
        KeySpec keySpec = new DESKeySpec(myKey.getBytes("ASCII"));
        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(keySpec);
        //IvParameterSpec iv = new IvParameterSpec(org.apache.commons.codec.binary.Hex.decodeHex(plainIV.toCharArray()));
        IvParameterSpec iv = new IvParameterSpec(mybyte);
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE,key,iv);
        byte[] encoded = cipher.doFinal(inputText.getBytes("ASCII"));   
        System.out.println("Encoded Value ..... "+Base64.encodeBase64(encoded));
    } catch(UnsupportedEncodingException e) {
        System.out.println("Exception .. "+ e.getMessage());
    }

在 .Net 中,我得到这个 - AOb0B20x2onFGz+JaFBsZyFbvCS9WF49D 作为编码值,但在 java 中,我得到有线编码字符串 - =�SKNv?�N�Ɛq{���U�;�/Z��� 8�<

编辑:-

跟着zacheusz解决了编码问题,但是.NET和java的编码字符串不一样...

最佳答案

我看到您在 .NET 中指定了 IV:

cryptoProvider.CreateEncryptor(bytes, bytes)

根据documentation第二个字节数组是 IV。所以你应该在 Java 中使用相同的数组。

我认为错误在这里:

cipher.doFinal(Base64.encodeBase64(inputText.getBytes("ASCII"))); 

你在解密之前对输入进行 b64 编码。

尝试

    byte[] output = cipher.doFinal(inputText.getBytes("ASCII"));  
    System.out.println("Encoded Value ..... "+new String(Base64.encodeBase64(output)));

补充说明(关于您在评论中的问题):

关于.NET 加密的 Java 等价物 - DESCryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316547/

相关文章:

java - 是否可以在java中使用DES算法加密和解密zip文件

java - 如何自定义Android评级栏形状并编号1-10?

java - 确定 Matlab 加载的 java 类的位置

c# - 在编写多线程代码之前需要了解哪些重要的线程 API 调用?

c# - 枚举上最常见的 C# 按位运算

c# - Rabbit MQ 句柄取消 token

java - 使用 DES 加密数据 - JAVA

java - 如何将具有状态的对象置于版本控制之下?这还有道理吗?

java - rowset.jar WAS 5.1 WAS 6.1 中的问题

encryption - 用C进行简单的加密实现