C#分块加密转JAVA如何实现

在C#里面,我引用SHA1加密一个明文,然后引用另一串明文进行分块加密,但是现在要转到JAVA里面实现,对于JAVA不是很了解,哈希的分块加密也没找到解释的文章,各位能给点思路吗?
如下是C#的实现方式:

public static void Main()
    {
        string passWord = "QWER1234.COM";
        string userWame = "03385";
        SHA1 sHA = SHA1.Create();
        byte[] bytes = Encoding.UTF8.GetBytes(passWord);
        byte[] bytes2 = Encoding.UTF8.GetBytes (userWame);
        byte[] buffer = sHA.ComputeHash (bytes);    
        Console.WriteLine("1-ComputeHash : {0}", BytesToStr(buffer));
        sHA.TransformBlock(bytes2, 0, bytes2.Length, bytes2, 0);
        Console.WriteLine("2-ComputeHash : {0}", BytesToStr(buffer));
        Console.WriteLine("3-ComputeHashBASE64 : {0}", Convert.ToBase64String(sHA.ComputeHash (buffer)));
    }

    public static string BytesToStr(byte[] bytes)
    {
        StringBuilder str = new StringBuilder();

        for (int i = 0; i < bytes.Length; i++)
            str.AppendFormat("{0:X2}", bytes[i]);

        return str.ToString();
    }

如下是控制台输出结果:
1-ComputeHash : 0D398019BAEBA2B26C7057E9DA0332364A2681DD
2-ComputeHash : 0D398019BAEBA2B26C7057E9DA0332364A2681DD
3-ComputeHashBASE64 : cbCE7PWS9MSwufR9LTs6+79F4kA=

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在Java中可以使用Java自带的MessageDigest类实现哈希算法,如SHA-1算法,可以使用以下代码:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;

public class SHA1Hash {
    public static void main(String[] args) {
        String password = "QWER1234.COM";
        String username = "03385";

        try {
            MessageDigest sha = MessageDigest.getInstance("SHA-1");
            byte[] passwordBytes = password.getBytes(StandardCharsets.UTF_8);
            byte[] usernameBytes = username.getBytes(StandardCharsets.UTF_8);

            byte[] buffer = sha.digest(passwordBytes);
            System.out.printf("1-ComputeHash : %s\n", bytesToHex(buffer));

            sha.update(usernameBytes, 0, usernameBytes.length);
            byte[] result = sha.digest();
            System.out.printf("2-ComputeHash : %s\n", bytesToHex(result));
            System.out.printf("3-ComputeHashBASE64 : %s\n", Base64.getEncoder().encodeToString(result));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    public static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            hexString.append(String.format("%02X", b));
        }
        return hexString.toString();
    }
}

分块加密可以在调用update方法之前先使用digest方法计算哈希值,然后再调用update方法对另一段明文进行分块加密。需要注意的是,在Java中,哈希值是不可逆的,无法还原明文,只能用于验证数据的完整性和一致性。

参考GPT和自己的思路:

在JAVA中,SHA1加密可以通过Java.security包中的MessageDigest类来实现。以下是一个示例代码:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Main {
    public static void main(String[] args) {
        String passWord = "QWER1234.COM";
        String userName = "03385";
        try {
            MessageDigest sha = MessageDigest.getInstance("SHA-1");
            byte[] bytes = passWord.getBytes("UTF-8");
            byte[] bytes2 = userName.getBytes("UTF-8");
            byte[] buffer = sha.digest(bytes);
            System.out.println("1-ComputeHash : " + bytesToStr(buffer));
            sha.update(bytes2);
            buffer = sha.digest();
            System.out.println("2-ComputeHash : " + bytesToStr(buffer));
            System.out.println("3-ComputeHashBASE64 : " + Base64.getEncoder().encodeToString(buffer));
        } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    public static String bytesToStr(byte[] bytes) {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < bytes.length; i++)
            str.append(String.format("%02X", bytes[i]));
        return str.toString();
    }
}

此代码与C#示例代码执行相同的步骤,并提供相同的输出。注意,在JAVA中需要导入java.util.Base64库来进行Base64编码。分块加密也是通过调用sha.update()方法来实现的。我希望这能解决您的问题。

参考GPT和自己的思路:

首先,在Java中使用SHA1加密需要引入java.security.MessageDigest类,可以使用如下代码进行SHA1加密:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHAUtil {
    public static String SHA1(String input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(input.getBytes());
        byte[] hash = md.digest();
        StringBuilder hexString = new StringBuilder();
        for (int i = 0; i < hash.length; i++) {
            String hex = Integer.toHexString(0xFF & hash[i]);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

然后,对于分块加密,需要使用Cipher类,代码如下:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class EncryptUtil {
    public static void main(String[] args) throws Exception {
        String passWord = "QWER1234.COM";
        String userWame = "03385";
        byte[] byteArray = passWord.getBytes();
        byte[] userWameByteArray = userWame.getBytes();
        byte[] hashArray = SHAUtil.SHA1(passWord).getBytes();
        byte[] input = Arrays.copyOf(hashArray, 16);
        System.arraycopy(userWameByteArray, 0, input, 0, userWameByteArray.length);
        byte[] keyBytes = passWord.getBytes();
        SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] result = cipher.doFinal(input);
        System.out.println("3-ComputeHashBASE64 : " + javax.xml.bind.DatatypeConverter.printBase64Binary(result));
    }
}

其中要注意的是,AES算法需要的密钥长度是16字节,因此在上述代码中,需要对hashArray进行截取或者补齐操作以满足长度要求,这里使用了Arrays.copyOf方法进行截取处理,同时使用了NoPadding的方式进行补齐,进而进行加密操作。