java - 如何使用我的密钥使用 javax.crypto.Cipher 进行加密?
问题描述
我需要一个简单的解决方案(我是新手)。它包括获取某个 16 HEX 密钥并用它加密另一个 16 HEX 密钥。该算法需要 128 个 AES/ECB/NoPadding。正是以这种格式感知MiBand 2健身手环的设备授权参数。但是我设法通过使用“javax.crypto.spec.SecretKeySpec”创建密钥来找到所有解决方案。我尝试以字节的形式向 cipher.init 发送密钥,但被告知“参数不匹配;字节 [] 无法转换为 java.security.Key”,其他格式也报错。我怎样才能找到解决方案?
package com.company;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Main
{ public static void main(String[] argv) {
String value = "9CC07199FECA0313403475ED62FEC727";
System.out.println("encriptVal = " + encrypt(value) );
}
public static String encrypt(String value) {
try {
SecretKeySpec sks = new SecretKeySpec(hexStringToByteArray("30313233343536373839404142434445"), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, sks, cipher.getParameters());
byte[] encrypted = cipher.doFinal(value.getBytes());
return byteArrayToHexString(encrypted);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private static byte[] hexStringToByteArray(String syc) {
byte[] b = new byte[syc.length() / 2];
for (int i = 0; i < b.length; i++) {
int index = i * 2;
int v = Integer.parseInt(syc.substring(index, index + 2), 16);
b[i] = (byte) v;
}
return b;
}
private static String byteArrayToHexString(byte[] b) {
StringBuilder sb = new StringBuilder(b.length * 2);
for (int i = 0; i < b.length; i++) {
int v = b[i] & 0xff;
if (v < 16) {
sb.append('0');
}
sb.append(Integer.toHexString(v));
}
return sb.toString().toUpperCase();
}
}