首页 > 解决方案 > AES 加密 C# -> Java

问题描述

我需要将此代码(C#)转换为 Java:

private static string hash(string _param0, byte[] _param1)
{
    byte[] bytes = Encoding.UTF8.GetBytes(_param0.ToLowerInvariant());
    byte[] inputBuffer = new byte[16];

    for (int index = 0; index < bytes.Length; ++index)
        inputBuffer[index % 16] ^= bytes[index];

    using (Aes aes = Aes.Create())
    {
        aes.Padding = PaddingMode.None;
        aes.Mode = CipherMode.CBC;
        using (ICryptoTransform encryptor = aes.CreateEncryptor(_param1, new byte[16]))
        {
            for (int index = 0; index < 16384; ++index)
                inputBuffer = encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
        }
    }

    byte[] inArray = new byte[8];
    Array.Copy((Array)inputBuffer, 0, (Array)inArray, 0, 4);
    Array.Copy((Array)inputBuffer, 8, (Array)inArray, 4, 4);

    return Convert.ToBase64String(inArray).Replace('+', '-').Replace('/', '_').Replace("=", string.Empty);
}

public static T[] encryptUntil<T>(this T[] _param0, int _param1, int _param2)
{
    T[] objArray = new T[_param1];

    while (--_param1 >= 0)
    {
        if (_param0.Length > _param2 + _param1)
            objArray[_param1] = _param0[_param2 + _param1];
    }

    return objArray;
}

private static byte[] encrypt(string _param0)
{
    byte[] bytes = Encoding.UTF8.GetBytes(_param0);
    byte[] inputBuffer = new byte[16]
    {
        (byte) 147,
        (byte) 196,
        (byte) 103,
        (byte) 227,
        (byte) 125,
        (byte) 176,
        (byte) 199,
        (byte) 164,
        (byte) 209,
        (byte) 190,
        (byte) 63,
        (byte) 129,
        (byte) 1,
        (byte) 82,
        (byte) 203,
        (byte) 86
    };

    for (int index = 0; index < 65536; ++index)
    {
        int num = 0;
        while (num < bytes.Length)
        {
            using (Aes aes = Aes.Create())
            {
                aes.Padding = PaddingMode.None;
                aes.Mode = CipherMode.CBC;
                using (ICryptoTransform encryptor = aes.CreateEncryptor(bytes.encryptUntil<byte>(16, num), new byte[16]))
                    inputBuffer = encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
            }

            num += 16;
        }
    }

    return inputBuffer;
}

所以基本上这使用带有 CBC 的 Aes 并且没有填充,并通过使用字节数组作为密钥来加密字符串。我尝试使用 Cipher 和“AES/CBC/NoPadding”,但我似乎无法弄清楚如何准确地做到这一点。如果有人可以帮助我,我将不胜感激!

标签: javac#base64aes

解决方案


推荐阅读