base64解码后如何检索IVParameterSpec?

时间:2018-11-23 15:00:25

标签: java encryption encoding decode

编辑:对于那些要求查看整个方法/类的人

我有一个Encrypter类,它在构造函数中创建IVParameterSpec,使用Encoder方法对IVParameterSpec进行编码,并在GetIV方法中返回IVParameterSpec。

这是Encrypter类

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;
    }
}

我有一个解密器类,它在构造函数中解码IVParameterSpec并在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;
    }
}

我的目的是确保Decryptor类中的restored_iv等于Encrypter类中的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构造函数中解码字符串的方式有关。

1 个答案:

答案 0 :(得分:3)

按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");
}