首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密码太短使用AES/CFB/NoPadding、AES/OFB/NoPadding或AES/ CBC/NoPadding

密码太短使用AES/CFB/NoPadding、AES/OFB/NoPadding或AES/ CBC/NoPadding
EN

Stack Overflow用户
提问于 2021-11-16 09:02:12
回答 1查看 217关注 0票数 0

有人能帮我加强或改进下面的代码,使密码“更长”。

我谦卑地寻找最好的方式使用AES/CFB/NoPadding,或与AES/CBC/NoPadding,或与AES/OFB/NoPadding。我们用AES/GCM/NOPADDING进行了测试。它适用于Java 8,但不适用于Java 7。

例如,使用‘’作为,使用作为pwd,pwd是:FX5O5A==,它非常“小”。

代码语言:javascript
复制
import java.security.MessageDigest;

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

import org.apache.xml.security.utils.Base64;

public class StringEncrypt {

    private final static String ALG = "AES";
    private final static String CI = "AES/CFB/NoPadding";

    public static String encrypt(String cleartext, String key) throws Exception {   
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(key.getBytes());
        IvParameterSpec iv = new IvParameterSpec(md.digest());
        
        Cipher cipher = Cipher.getInstance(CI);
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), ALG);
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(cleartext.getBytes());
        
        return new String(Base64.encode(encrypted));
    }

    public static String decrypt(String encrypted, String key) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(key.getBytes());
        IvParameterSpec iv = new IvParameterSpec(md.digest());

        Cipher cipher = Cipher.getInstance(CI);
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), ALG);
        byte[] enc = Base64.decode(encrypted);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] decrypted = cipher.doFinal(enc);
        
        return new String(decrypted);
    }

    public static void main(String[] args) throws Exception {
        if (args.length == 2) {
            String pwd = StringEncrypt.encrypt(args[0], args[1]);
            System.out.println("Key encryption: " + pwd);
            pwd = StringEncrypt.decrypt(pwd, args[1]);
            if (args[0].equals(pwd)) {
                System.out.println("[OK] Correct decryption!");
            } else {
                System.out.println("[KO] Wrong decryption!");
            }
        } else {
            System.out.println("The parameters are required: <key_to_encrypt> <encryption_key>");
        }
    }

}

换句话说,有人能给我一个在Java 7中工作的好的加密/解密的例子吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-16 11:03:30

如果要增加长度,则需要增加加密/解密参数的字节数。您可以通过更改字符集来破解这个问题,尽管我认为这不是最佳实践:

代码语言:javascript
复制
        byte[] encrypted = cipher.doFinal(cleartext.getBytes(StandardCharsets.UTF_16));

        return new String(decrypted, StandardCharsets.UTF_16);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69986279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档