简体   繁体   English

在 Java 中解码 C# 生成的 AES IV 和 KEY

[英]Decode C# generated AES IV and KEY in Java

In C# they are generating key by using below code.在 C# 中,他们使用以下代码生成密钥。

using System;
using System.Text;
using System.Security.Cryptography;
                    
public class Program
{
    public static void Main()
    {            
                var aesEncryption = new RijndaelManaged
{
    KeySize = 128,
    BlockSize = 128,
    Mode = CipherMode.CBC,
    Padding = PaddingMode.PKCS7

};
    aesEncryption.GenerateIV();
    string ivStr = Convert.ToBase64String(aesEncryption.IV);
    aesEncryption.GenerateKey();
    string keyStr = Convert.ToBase64String(aesEncryption.Key);
    string completeKey = Convert.ToBase64String(ASCIIEncoding.UTF8.GetBytes(ivStr + "," + keyStr));
    // Console.WriteLine(completeKey);
                }
}

Sample completeKey: SENTUkR2QjZ1ZjBYV0o2aXNCcnRqQT09LDJpdTZHMUpWYm0rbTQ2Njl6ZG83Z2c9PQ==样本完成密钥:SENTUkR2QjZ1ZjBYV0o2aXNCcnRqQT09LDJpdTZHMUpWYm0rbTQ2Njl6ZG83Z2c9PQ==

In Java how I decode completeKey to get IV and Key.I used below code and that Key and IV is not 128 Bit and my encryption is failing.在 Java 中,我如何解码 completeKey 以获得 IV 和 Key。我使用了下面的代码,并且 Key 和 IV 不是 128 位,我的加密失败了。

import java.util.Base64;

public class HelloWorld{

     public static void main(String []args){
        String originalInput = "SENTUkR2QjZ1ZjBYV0o2aXNCcnRqQT09LDJpdTZHMUpWYm0rbTQ2Njl6ZG83Z2c9PQ==";

String decodedString = new String(Base64.getDecoder().decode(originalInput.getBytes()));
        String[] arrOfStr = decodedString.split(",", 2); 
        String iv=arrOfStr[0];
        String key=arrOfStr[1];
        System.out.println(decodedString);//HCSRDvB6uf0XWJ6isBrtjA==,2iu6G1JVbm+m4669zdo7gg==
        System.out.println(iv);//HCSRDvB6uf0XWJ6isBrtjA==
        System.out.println(key);//2iu6G1JVbm+m4669zdo7gg==
 

        
       
     }
}

Your IV and key are first encoded to Base64-Strings, then concatenated with a ',' as delimiter, the resulting string is converted to a byte array and then finally Base64-encoded.您的 IV 和密钥首先被编码为 Base64 字符串,然后与“,”作为分隔符连接,生成的字符串被转换为字节数组,最后是 Base64 编码。

The following program is doing it backwards and in the end you find an IV with (correct) length of 16 bytes and an AES key with a length of 16 bytes = 128 bit - both will work for AES encryption in CBC mode.以下程序正在反向执行,最后您会找到一个(正确)长度为 16 字节的 IV 和一个长度为 16 字节 = 128 位的 AES 密钥 - 两者都适用于 CBC 模式下的 AES 加密。

Security warning: This way of transporting the key will be unsecure in most ways, so the following code is for educational purposes only.安全警告:这种传输密钥的方式在大多数情况下都是不安全的,因此以下代码仅用于教育目的。

result:结果:

Decode C# generated AES IV and KEY in Java
ivStr: k7ivGm6OoMHRlnk4tZCAMA==
ivExp: k7ivGm6OoMHRlnk4tZCAMA==
keyStr: Lq5wkaGWFknsEKUxoAY46w==
keyExp: Lq5wkaGWFknsEKUxoAY46w==
iv  length: 16 data: 93b8af1a6e8ea0c1d1967938b5908030
key length: 16 data: 2eae7091a1961649ec10a531a00638eb

code:代码:

import java.util.Base64;

public class Main {
    public static void main(String[] args) {
        System.out.println("Decode C# generated AES IV and KEY in Java");
        // https://stackoverflow.com/questions/63503753/decode-c-sharp-generated-aes-iv-and-key-in-java
        /* dataset
        iv:k7ivGm6OoMHRlnk4tZCAMA==
        key: Lq5wkaGWFknsEKUxoAY46w==
        azdpdkdtNk9vTUhSbG5rNHRaQ0FNQT09LExxNXdrYUdXRmtuc0VLVXhvQVk0Nnc9PQ==
         */
        String originalInput = "azdpdkdtNk9vTUhSbG5rNHRaQ0FNQT09LExxNXdrYUdXRmtuc0VLVXhvQVk0Nnc9PQ==";
        byte[] originalInputByte = Base64.getDecoder().decode(originalInput);
        String decodedString = new String(originalInputByte);
        String[] arrOfStr = decodedString.split(",", 2);
        String ivStr = arrOfStr[0];
        String keyStr = arrOfStr[1];
        System.out.println("ivStr: " + ivStr);
        System.out.println("ivExp: " + "k7ivGm6OoMHRlnk4tZCAMA==");
        System.out.println("keyStr: " + keyStr);
        System.out.println("keyExp: " + "Lq5wkaGWFknsEKUxoAY46w==");
        // final conversion to byte[]
        byte[] iv = Base64.getDecoder().decode(ivStr);
        byte[] key = Base64.getDecoder().decode(keyStr);
        System.out.println("iv  length: " + iv.length + " data: " + bytesToHex(iv));
        System.out.println("key length: " + key.length + " data: " + bytesToHex(key));
    }
    private static String bytesToHex(byte[] bytes) {
        StringBuffer result = new StringBuffer();
        for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        return result.toString();
    }
}  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM