Java getEncoded()方法,每次对同一个键调用它时都会给出不同的结果?

Java getEncoded()方法,每次对同一个键调用它时都会给出不同的结果?,java,kotlin,debugging,cryptography,Java,Kotlin,Debugging,Cryptography,按照我的理解,密钥编码应该返回某些特定编码(例如UTF-8)中的字节序列 但是,要记录以下内容: KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC"); kpg.initialize(256); KeyPair kp = kpg.generateKeyPair(); Log("TEST : ${kp.public.encoded}") Log("Test : ${kp.pu

按照我的理解,密钥编码应该返回某些特定编码(例如UTF-8)中的字节序列

但是,要记录以下内容:

 KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
 kpg.initialize(256);
 KeyPair kp = kpg.generateKeyPair();

 Log("TEST : ${kp.public.encoded}")
 Log("Test : ${kp.public.encoded}")
同样,在Java中:

kp.getPublic().getEncoded();
正在给我2个不同的字节数组!我错过了什么

似乎每次我调用编码的方法时,都会生成不同的对。

试着这样做

import android.util.Base64;

import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class AESEncyption {

    private static final int pswdIterations = 10;
    private static final int keySize = 128;
    private static final String cypherInstance = "AES/CBC/PKCS5Padding";
    private static final String secretKeyInstance = "PBKDF2WithHmacSHA1";
    private static final String plainText = "sampleText";
    private static final String AESSalt = "exampleSalt";
    private static final String initializationVector = "8119745113154120";

    public static String encrypt(String textToEncrypt) throws Exception {

        SecretKeySpec skeySpec = new SecretKeySpec(getRaw(plainText, AESSalt), "AES");
        Cipher cipher = Cipher.getInstance(cypherInstance);
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(initializationVector.getBytes()));
        byte[] encrypted = cipher.doFinal(textToEncrypt.getBytes());
        return Base64.encodeToString(encrypted, Base64.DEFAULT);
    }

    public static String decrypt(String textToDecrypt) throws Exception {

        byte[] encryted_bytes = Base64.decode(textToDecrypt, Base64.DEFAULT);
        SecretKeySpec skeySpec = new SecretKeySpec(getRaw(plainText, AESSalt), "AES");
        Cipher cipher = Cipher.getInstance(cypherInstance);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(initializationVector.getBytes()));
        byte[] decrypted = cipher.doFinal(encryted_bytes);
        return new String(decrypted, "UTF-8");
    }

    private static byte[] getRaw(String plainText, String salt) {
        try {
            SecretKeyFactory factory = SecretKeyFactory.getInstance(secretKeyInstance);
            KeySpec spec = new PBEKeySpec(plainText.toCharArray(), salt.getBytes(), pswdIterations, keySize);
            return factory.generateSecret(spec).getEncoded();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return new byte[0];
    }

}

这不能解决我的问题你没有看内容。对给定键对象调用
getEncoded
时,会返回一个新复制的(可变的)
byte[]
,其内容相同,但您使用的是
object.toString()
,它显示数组的哈希码(即标识),而不是数组的内容。看见