Java 用十六进制编码器代替SHA-256字符串生成奇怪字符串的方法
我是Java编程新手 我想得到一些给定字符串的sha-256散列 我得到: 㔴晥㜶晥㜶㔴扡㔴晥扡㌲㌲㌲摣㔴㜶㌲扡扡㌲㌲㜶㜶晥㔴 但是期待着类似于: 074CFBAD12 BADE66C92D01142B83C8F2B24030959980151F83972F4575A43E1 这是我的密码:Java 用十六进制编码器代替SHA-256字符串生成奇怪字符串的方法,java,string,tostring,Java,String,Tostring,我是Java编程新手 我想得到一些给定字符串的sha-256散列 我得到: 㔴晥㜶晥㜶㔴扡㔴晥扡㌲㌲㌲摣㔴㜶㌲扡扡㌲㌲㜶㜶晥㔴 但是期待着类似于: 074CFBAD12 BADE66C92D01142B83C8F2B24030959980151F83972F4575A43E1 这是我的密码: import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HelloWorld{
private static final char[] DIGITS;
static {
char[] arrc;
char[] arrc2 = arrc = new char[16];
arrc2[0] = 12592;
arrc2[1] = 13106;
arrc2[2] = 13620;
arrc2[3] = 14134;
arrc2[4] = 14648;
arrc2[5] = 25185;
arrc2[6] = 25699;
arrc2[7] = 26213;
DIGITS = arrc;
}
public static void main(String []args){
StringBuilder localStringBuilder = new StringBuilder();
localStringBuilder.append(55);
localStringBuilder.append("market-gap");
localStringBuilder.append("marjet-gre");
localStringBuilder.append("1");
localStringBuilder.append("05/19/1989");
localStringBuilder.append("6.3.0");
localStringBuilder.append("0");
localStringBuilder.append("");
localStringBuilder.append("en");
localStringBuilder.append("");
localStringBuilder.append("00e0533117bb8707");
String paramString1 = localStringBuilder.toString();
String strrrr = sha256(paramString1);
System.out.println(strrrr);
}
public static String encodeHex(byte[] arrby) {
StringBuilder stringBuilder = new StringBuilder(arrby.length * 2);
for (int i = 0; i < arrby.length; ++i) {
stringBuilder.append(DIGITS[(arrby[i] & 240) >>> 4]);
stringBuilder.append(DIGITS[arrby[i] & 15]);
}
return stringBuilder.toString();
}
public static String sha256(String paramString)
{
try
{
MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-256");
return encodeHex(localMessageDigest.digest(paramString.getBytes()));
}
catch (NoSuchAlgorithmException e)
{
//ThrowableExtension.printStackTrace(e);
}
return null;
}
}
import java.security.MessageDigest;
导入java.security.NoSuchAlgorithmException;
公共类HelloWorld{
私有静态最终字符[]位;
静止的{
char[]arrc;
字符[]arrc2=arrc=新字符[16];
arrc2[0]=12592;
arrc2[1]=13106;
arrc2[2]=13620;
arrc2[3]=14134;
arrc2[4]=14648;
arrc2[5]=25185;
arrc2[6]=25699;
arrc2[7]=26213;
数字=arrc;
}
公共静态void main(字符串[]args){
StringBuilder localStringBuilder=新建StringBuilder();
localStringBuilder.append(55);
localStringBuilder.append(“市场缺口”);
localStringBuilder.append(“marjet gre”);
localStringBuilder.append(“1”);
localStringBuilder.append(“1989年5月19日”);
localStringBuilder.append(“6.3.0”);
localStringBuilder.append(“0”);
localStringBuilder.append(“”);
localStringBuilder.append(“en”);
localStringBuilder.append(“”);
localStringBuilder.append(“00e0533117bb8707”);
字符串paramString1=localStringBuilder.toString();
字符串strrrr=sha256(paramString1);
系统输出打印项次(strrrr);
}
公共静态字符串encodeHex(字节[]arrby){
StringBuilder StringBuilder=新StringBuilder(arrby.length*2);
对于(int i=0;i>>4]);
stringBuilder.append(数字[arrby[i]&15]);
}
返回stringBuilder.toString();
}
公共静态字符串sha256(字符串参数字符串)
{
尝试
{
MessageDigest localMessageDigest=MessageDigest.getInstance(“SHA-256”);
返回encodeHex(localMessageDigest.digest(paramString.getBytes());
}
捕获(无算法异常)
{
//ThrowableExtension.printStackTrace(e);
}
返回null;
}
}
我做错了什么
你的十六进制编码器看起来很可疑。它到底应该如何工作 您可以尝试JDK中已经存在的转换器:
public static String sha256(String paramString) {
try {
MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-256");
byte[] binaryDigest = localMessageDigest.digest(paramString.getBytes());
return DatatypeConverter.printHexBinary(binaryDigest);
} catch (NoSuchAlgorithmException e) {
// ThrowableExtension.printStackTrace(e);
}
return null;
}
编辑:
好的,明白了
您的数字
值错误。以下是一个工作版本:
public class HelloWorld {
private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
public static void main(String[] args) {
StringBuilder localStringBuilder = new StringBuilder();
localStringBuilder.append(55);
localStringBuilder.append("market-gap");
localStringBuilder.append("marjet-gre");
localStringBuilder.append("1");
localStringBuilder.append("05/19/1989");
localStringBuilder.append("6.3.0");
localStringBuilder.append("0");
localStringBuilder.append("");
localStringBuilder.append("en");
localStringBuilder.append("");
localStringBuilder.append("00e0533117bb8707");
String paramString1 = localStringBuilder.toString();
String strrrr = sha256(paramString1);
System.out.println(strrrr);
}
public static String encodeHex(byte[] arrby) {
StringBuilder stringBuilder = new StringBuilder(arrby.length * 2);
for (int i = 0; i < arrby.length; ++i) {
stringBuilder.append(DIGITS[(arrby[i] & 0xF0) >>> 4]);
stringBuilder.append(DIGITS[arrby[i] & 0x0F]);
}
return stringBuilder.toString();
}
public static String sha256(String paramString) {
try {
MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-256");
return encodeHex(localMessageDigest.digest(paramString.getBytes()));
} catch (NoSuchAlgorithmException e) {
// ThrowableExtension.printStackTrace(e);
}
return null;
}
}
公共类HelloWorld{
私有静态最终字符[]位={0',1',2',3',4',5',6',7',8',9',A',B',C',D',E',F'};
公共静态void main(字符串[]args){
StringBuilder localStringBuilder=新建StringBuilder();
localStringBuilder.append(55);
localStringBuilder.append(“市场缺口”);
localStringBuilder.append(“marjet gre”);
localStringBuilder.append(“1”);
localStringBuilder.append(“1989年5月19日”);
localStringBuilder.append(“6.3.0”);
localStringBuilder.append(“0”);
localStringBuilder.append(“”);
localStringBuilder.append(“en”);
localStringBuilder.append(“”);
localStringBuilder.append(“00e0533117bb8707”);
字符串paramString1=localStringBuilder.toString();
字符串strrrr=sha256(paramString1);
系统输出打印项次(strrrr);
}
公共静态字符串encodeHex(字节[]arrby){
StringBuilder StringBuilder=新StringBuilder(arrby.length*2);
对于(int i=0;i>>4]);
追加(数字[arrby[i]&0x0F]);
}
返回stringBuilder.toString();
}
公共静态字符串sha256(字符串参数字符串){
试一试{
MessageDigest localMessageDigest=MessageDigest.getInstance(“SHA-256”);
返回encodeHex(localMessageDigest.digest(paramString.getBytes());
}捕获(无算法异常){
//ThrowableExtension.printStackTrace(e);
}
返回null;
}
}
此外,为了可读性,我将int
240
和15
更改为0xF0
和0x0F
您在静态块中使用的是汉字。是的,数字出现问题。谢谢