V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wo642436249
V2EX  ›  Java

初来乍到,问一个 Java 的 AES-256-ECB 加密解密问题

  •  
  •   wo642436249 · 2019-05-05 08:37:55 +08:00 · 5203 次点击
    这是一个创建于 2029 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近要求从 php 转 java,快速又低质量的撸了一遍菜鸟教程 java 教程后,立刻投入 spring boot 的怀抱,然后做其中一个模块时用到了 AES-256-ECB 加密解密。
    21 条回复    2019-05-05 13:14:52 +08:00
    wo642436249
        1
    wo642436249  
    OP
       2019-05-05 08:40:51 +08:00
    代码如下:
    加密: 参数是密码
    public static String AdminPasswordEncrypt(String password) throws Exception { //AES-256-ECB
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes()));
    SecretKey secretKey = kgen.generateKey();
    byte[] enCodeFormat = secretKey.getEncoded();
    SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(password.getBytes("utf-8"));
    return new Base64().encodeToString(encrypted);
    }

    解密:参数是加密后的密码
    public static String AdminPasswordDecrypt(String enPassword) throws Exception {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes()));
    SecretKey secretKey = kgen.generateKey();
    byte[] enCodeFormat = secretKey.getEncoded();
    SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES");

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] encrypted1 = new Base64().decode(enPassword);
    byte[] original = cipher.doFinal(encrypted1);
    String originalString = new String(original, "utf-8");
    return originalString;
    }


    加密时没有报错,解密时一直报错,不晓得如何修改,望大佬指点。
    lhx2008
        2
    lhx2008  
       2019-05-05 08:41:30 +08:00 via Android
    java 的加密解密挺麻烦,有个轮子是 jasypt
    wo642436249
        3
    wo642436249  
    OP
       2019-05-05 08:43:51 +08:00
    @lhx2008 好的,我先了解一下这个轮子。说到 java 加密解密麻烦,我刚上手 spring boot 的时候感觉 Java 写一般的 web 项目的时候有的地方感觉比 php 还简单,但是做到这个加解密的时候发现是真费劲
    lhx2008
        4
    lhx2008  
       2019-05-05 08:50:58 +08:00 via Android
    @wo642436249 是的,而且你用 java 自带的是非线程安全的,jasypt 可以和 springboot 整合
    vance
        5
    vance  
       2019-05-05 09:04:10 +08:00
    导入的包是什么,我运行下
    wolfie
        6
    wolfie  
       2019-05-05 09:12:00 +08:00
    `new SecureRandom(AdminOpensslKey.getBytes())`
    加密、解密时候产生的是一个值吗。
    Cyron
        7
    Cyron  
       2019-05-05 09:13:06 +08:00
    KeyGenerator kgen = KeyGenerator.getInstance("AES");

    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(secureKey.getBytes());
    kgen.init(128, secureRandom);

    SecretKey secretKey = kgen.generateKey();
    byte[] enCodeFormat = secretKey.getEncoded();
    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] byteContent = content.getBytes("utf-8");
    byte[] result = cipher.doFinal(byteContent);

    return encodeBASE64(result);
    skypyb
        8
    skypyb  
       2019-05-05 09:38:06 +08:00 via Android
    我之前写着玩的一小工具,里面有我封装的加密 /签名组件。有 aes 的。 你看看用的上不。
    https://github.com/skypyb/JwtBuilder-CryptographicComponent
    Citrus
        9
    Citrus  
       2019-05-05 09:55:10 +08:00
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes()));
    SecretKey secretKey = kgen.generateKey();
    byte[] enCodeFormat = secretKey.getEncoded();
    SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES");

    你每次加解密随机生成一个 Key,怎么玩?这是在学习猴子排序法么。。。随机到正确的 Key 就能解密成功?
    scoful
        10
    scoful  
       2019-05-05 09:55:51 +08:00
    是不是 java 安全那个证书的问题,google 一下
    jinue9900
        11
    jinue9900  
       2019-05-05 10:19:05 +08:00
    你的是 jdk1.8_162 以上的版本嘛 这个版本除去了加密的一些限制
    wo642436249
        12
    wo642436249  
    OP
       2019-05-05 10:35:55 +08:00
    @skypyb 有 AES-256-ECB 这个加解密的方法嘛?
    HangoX
        13
    HangoX  
       2019-05-05 10:37:17 +08:00   ❤️ 1
    https://github.com/google/tink 谷歌为了防止大家把加密解密写错,专门出了一个多语言平台的库
    xiangyuecn
        14
    xiangyuecn  
       2019-05-05 10:45:26 +08:00
    i...i...iv

    简单点的:保证对同一内容的加密 每次返回结果都一样,再来谈只用一个参数(密码)来解密。问题解决。
    qwerthhusn
        15
    qwerthhusn  
       2019-05-05 10:51:37 +08:00
    ```
    public static void main(String[] args) throws Exception {
    // openssl enc -e -nosalt -aes-128-ecb -p -K 71776572747975696f70617364666768 -in 1.txt -out 1.enc
    // base64 1.enc
    byte[] keyPlain = "qwertyuiopasdfgh".getBytes(Charsets.ISO_8859_1);
    System.out.println("key = " + Hex.encodeHexString(keyPlain));
    SecretKeySpec key = new SecretKeySpec(keyPlain, "AES");

    byte[] plain = "ABCDEF\n".getBytes(Charsets.ISO_8859_1);
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] encrypted = cipher.doFinal(plain);
    System.out.println(Base64.encodeBase64String(encrypted));
    }
    ```

    用 Java 的用 OpenSSL 加出来的结果是一样的
    CRVV
        16
    CRVV  
       2019-05-05 10:58:21 +08:00
    @HangoX
    这种库通常不会有 ECB 的,因为用 ECB 就已经写错了
    类似这种的还有 libsodium
    WordTian
        17
    WordTian  
       2019-05-05 10:59:04 +08:00 via Android
    emmm
    从 1 楼看,参数是要加密的内容好吗? key 是你用 kgen.generateKey()随机生成的啊
    就像 9# @Citrus 说的,你要能成功加解密就怪了
    tcitry
        18
    tcitry  
       2019-05-05 11:00:35 +08:00
    wo642436249
        19
    wo642436249  
    OP
       2019-05-05 11:18:38 +08:00
    @vance 照着代码敲,idea 编辑器自动加载了,哈哈
    gaius
        20
    gaius  
       2019-05-05 11:42:01 +08:00
    加密解密的 key 要一样,如果有 iv iv 也要一样... 如果是 jdk7 提示 key 长度不合法还要去 Oracle 下载 2 个 jar
    wo642436249
        21
    wo642436249  
    OP
       2019-05-05 13:14:52 +08:00
    @gaius 用的是 8 版本的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1192 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:30 · PVG 02:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.