如何在 base64 解码后检索 IVParameterSpec?

How do I retrieve an IVParameterSpec after base64 decode?

编辑:对于那些要求查看整个 methods/classes

的人

我有一个 class 加密器,它在构造函数中创建一个 IVParameterSpec,在 Encoder 方法中对 IVParameterSpec 进行编码,returns 在 GetIV 方法中对 IVParameterSpec 进行编码。

这是加密器class

public class Encrypter
{

   public IVParameterSpec ctr_iv;   

   public Encrypter(int keylength)
    {
        //ctr_iv is created in this constructor
        byte [] counter = new byte[16];
        ctr_iv = new IvParameterSpec(counter);
        System.out.println("The iv is " + ctr_iv);
    }

   public String Encoder()
    {
        String encoded_IV = Base64.getEncoder().encodeToString(ctr_iv.getIV());

        return encoded_IV;
    }

   public IvParameterSpec getIV()
    {
        return ctr_iv;
    }
}

我有一个 class 解码器,它解码构造函数中的 IVParameterSpec 和 returns GetIV 方法中的 IVParameterSpec。

public class Decrypter
{
   IvParameterSpec retrieved_iv;

    public Decrypter(String iv)
    {
        byte [] decodedIV = Base64.getDecoder().decode(iv);
        retrieved_iv = new IvParameterSpec(decodedIV);
        System.out.println("The iv in this class is " + retrieved_iv);
    }

   public IvParameterSpec getIV()
    {
        return retrieved_iv;
    }
}

我的目标是确保解密器 class 中的 retrieved_iv 等于加密器 class 中的 ctr_iv。我最初认为上面的构造函数可以解决问题。但是当我测试他们的平等价值观时,我发现他们并不平等。这就是我测试它们的方式:

public class Main
{
   public static void main(String [] args)
    {
        Encrypter encrypter = new Encrypter();  //Initializes ctr_iv
        Decrypter decrypter = new Decrypter(encrypter.Encoder()); //Encodes ctr_iv in first object and passes it as an argument to the constructor of the 2nd object

        if(encrypter.GetIV().equals(decrypter.GetIV()))
        {
            System.out.println("IV's are equal");
        }else{System.out.println("IV's are not equal");}
    }
}

我感觉这与我在 Decrypter 构造函数中解码字符串的方式有关。

比较Arrays.equals。

if(Arrays.equals(ctr_iv.getIV(),retrieved_iv.getIV()))         {
    System.out.println("IV's are equal");
} else {
    System.out.println("IV's are not equal");
}