初来乍到,问一个 Java 的 AES-256-ECB 加密解密问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wo642436249
V2EX    Java

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

  •  
  •   wo642436249 2019-05-05 08:37:55 +08:00 5552 次点击
    这是一个创建于 2351 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近要求从 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-5-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     Solana     2747 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 11:45 PVG 19:45 LAX 04:45 JFK 07:45
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86