为了账号安全,请及时绑定邮箱和手机立即绑定

使用给定加密算法的 Base64 解密(DES base64、secretKey、Cipher)

使用给定加密算法的 Base64 解密(DES base64、secretKey、Cipher)

MMTTMM 2021-08-04 15:11:44
当我通过以下代码加密密码!QAZxdr5 时:public static String encryptPassword(String msg) {    try {        KeySpec keySpec = new DESKeySpec(msg.getBytes());        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(keySpec);        Cipher ecipher = Cipher.getInstance(key.getAlgorithm());        ecipher.init(Cipher.ENCRYPT_MODE, key);        //Encode the string into bytes using utf-8        byte[] utf8 = msg.getBytes("UTF8");        //Encrypt        byte[] enc = ecipher.doFinal(utf8);        //Encode bytes to base64 to get a string        return new String(Base64.getEncoder().encode(enc));    } catch (InvalidKeyException e) {        e.printStackTrace();    } catch (InvalidKeySpecException e) {        e.printStackTrace();    } catch (NoSuchAlgorithmException e) {        e.printStackTrace();    } catch (NoSuchPaddingException e) {        e.printStackTrace();    } catch (IllegalStateException e) {        e.printStackTrace();    } catch (IllegalBlockSizeException e) {        e.printStackTrace();    } catch (BadPaddingException e) {        e.printStackTrace();    } catch (UnsupportedEncodingException e) {        e.printStackTrace();    }    return null;}我得到了输出:QQiu2a4NT9YfDAtmHjbk1A==现在我尝试为此创建解密:public static String decrypt(String msg) {    try {        KeySpec keySpec = new DESKeySpec(msg.getBytes());        SecretKey key =         SecretKeyFactory.getInstance("DES").generateSecret(keySpec);        Cipher decipher = Cipher.getInstance(key.getAlgorithm());        decipher.init(Cipher.DECRYPT_MODE, key);        // Decode base64 to get bytes        byte[] dec = Base64.getDecoder().decode(msg.getBytes("UTF-8"));        //Decrypt但是,它无法正常工作,因为它返回 null :(。你能帮忙检查一下我错在哪里吗?
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

在 DES 加密中,它使用相同的密钥来加密和解密消息。因此,对于这两个操作,您需要具有相同的密钥。


在您的情况下,您使用了与密钥和密码相同的字符串。


public static String encryptPassword(String msg) {

    try {

        KeySpec keySpec = new DESKeySpec(msg.getBytes());

在上面的代码段中,当创建新的 DESKeySpec 对象时,您也需要传递密钥。


public static String decrypt(String msg) {

    try {

        KeySpec keySpec = new DESKeySpec(msg.getBytes());

即使在上面的解密方法中,您也必须传递在加密方法中使用的相同密钥。但是在这里你已经给出了编码字符串来生成密钥。那就是你出错的地方。


因此,我建议您通过添加一个更多参数作为键来更改方法参数,然后在两种方法中为键传递相同的值。


  public static String encryptPassword(String msg, String keySp) {

        try {

            KeySpec keySpec = new DESKeySpec(keySp.getBytes());

            }


    public static String decrypt(String msg, String keySp) {

            try {

                KeySpec keySpec = new DESKeySpec(keySp.getBytes());

                }

我只包含了需要更改的行。


您可以通过以下方式调用这些方法,


String key = "!QAZxdr5";

String password = "!QAZxdr5";

String encriptedPassword = encryptPassword(password, key);

System.out.println(decrypt(encriptedPassword, key));


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 311 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信