如何使用我的密钥使用javax.crypto.Cipher进行加密?

如何使用我的密钥使用javax.crypto.Cipher进行加密?,java,encryption,aes,Java,Encryption,Aes,我需要一个简单的问题解决方案(我是新手)。它包括获取某个16进制密钥并用它加密另一个16进制密钥。该算法需要128个AES/ECB/NOP。正是在这种格式中,MIB和2健身手镯设备的授权参数被感知。 但是我找到的所有解决方案都是通过使用“javax.crypto.spec.SecretKeySpec”创建密钥来实现的。 我试图以字节的形式将密钥发送到cipher.init,但有人告诉我“参数不匹配;字节[]无法转换为java.security.key”,其他格式也会给出错误。我怎样才能找到解决办

我需要一个简单的问题解决方案(我是新手)。它包括获取某个16进制密钥并用它加密另一个16进制密钥。该算法需要128个AES/ECB/NOP。正是在这种格式中,MIB和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();
                                                         }


}

package.com公司;
导入javax.crypto.Cipher;
导入javax.crypto.spec.SecretKeySpec;
公共班机
{公共静态void main(字符串[]argv){
字符串值=“9CC07199FECA033134034475ED62FEC727”;
System.out.println(“encriptVal=“+encrypt(value));
}
公共静态字符串加密(字符串值){
试一试{
SecretKeySpec sks=新的SecretKeySpec(hexStringToByteArray(“303132333435363373839404142434445”),“AES”);
Cipher Cipher=Cipher.getInstance(“AES/ECB/NoPadding”);
cipher.init(cipher.ENCRYPT_模式,sks,cipher.getParameters());
byte[]encrypted=cipher.doFinal(value.getBytes());
返回byteArrayTohextString(加密);
}
捕获(例外e){
抛出新的运行时异常(e);
}
}
私有静态字节[]hexStringToByteArray(字符串syc){
字节[]b=新字节[syc.length()/2];
for(int i=0;i
您的代码正在按预期运行。输出为“encriptVal=E70D92ECB1B2038561BE298BF79C40D0A1C1EDE261B8F5F7D92A285F92765C2E”,因此我无法重现您的问题/错误。是的,没错。事实上,输出将是32个答案,我需要16个答案,就像我的消息中的键一样。我怀疑SecretKeySpec正在进行一些不必要的转换,这使得加密响应变长,所以我想在不使用此方法的情况下运行代码,看看我是对还是错,但是没有SecretKeySpec我无法运行代码,我问如何直接向密码请求密钥。很抱歉,我听不懂你的。您的密钥是一个32(十六进制)字符长的字符串,将其解码为字节数组后,您将得到一个16字节长的数组,非常适合AES-128加密。编码后的输入是32个字符长=32字节,输出是64个十六进制字符串字符=32字节,所以一切正常。但也许您的输入是一个十六进制字符串,应该用“HextStringToByteArray”编码?我还没有学会如何表达。因此,我会这样做。我使用一个在线转换器,给定消息(“9CC07199FECA03134475ED62FEC727”)和键(“303132333435363733839404142434445”)的值,该转换器给出结果“797D862EA3B6898D60F12F448D94D3C”。我试图通过Java实现同样的效果,但它给我的结果是原来的两倍,而且字符不同。我试图通过“hexStringToByteArray”转换键,但出现格式错误。我建议通过hexStringToByteArray转换器运行该值。。。