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

Java 小白提问,这段代码是标准 RSA 加密吗

  •  1
     
  •   seers · 2022-10-04 09:27:16 +08:00 · 2583 次点击
    这是一个创建于 563 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对加密方面不太熟,请大佬帮忙看看

    public static String encryptByPublicKey(String source, byte[] key) throws Exception {
        byte[] data = source.getBytes("utf-8");
        byte[] keyBytes = key;
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(1, publicKey);
        int inputLen = data.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;
        int i = 0;
        while (inputLen - offSet > 0) {
          byte[] cache;
          if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
            cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
          } else {
            cache = cipher.doFinal(data, offSet, inputLen - offSet);
          } 
          out.write(cache, 0, cache.length);
          i++;
          offSet = i * MAX_ENCRYPT_BLOCK;
        } 
        byte[] encryptedData = out.toByteArray();
        out.close();
        return (new String(Base64.encodeBase64(encryptedData), "UTF8")).replaceAll("\r\n", "");
      }
    
    9 条回复    2022-10-04 11:24:11 +08:00
    liprais
        1
    liprais  
       2022-10-04 09:36:10 +08:00 via iPhone
    RSA/ECB/PKCS1Padding
    这不都写了
    seers
        2
    seers  
    OP
       2022-10-04 09:39:21 +08:00
    @liprais 我在用 go 重写某个接口,其中会用到这个校验,但是我调用 go 的标准 rsa 实现访问接口一直报错
    liprais
        3
    liprais  
       2022-10-04 10:07:20 +08:00 via iPhone
    @seers 很显然你写的跟 java 的实现不一样,我猜问题出在 padding 上
    wangsongyan
        4
    wangsongyan  
       2022-10-04 10:08:49 +08:00
    贴出 go 代码和对应的 Java 明文、key 、密文更好解决
    eason1874
        5
    eason1874  
       2022-10-04 10:16:53 +08:00
    很明显是内置标准 RSA 库,但他是分块加密,然后再把结果拼接起来,所以你解密的时候也要分块

    MAX_ENCRYPT_BLOCK 是它明文块长度,根据它可以算出密文块有多长,不过代码里应该还有对应的 MAX_DECRYPT_BLOCK 表示密文块有多长,直接看那个就行
    seers
        6
    seers  
    OP
       2022-10-04 10:23:54 +08:00
    lysS
        7
    lysS  
       2022-10-04 10:26:26 +08:00
    最后对密文算了 base64 的,要用 DecryptPKCS1v15 进行解密
    seers
        8
    seers  
    OP
       2022-10-04 10:30:04 +08:00
    @eason1874 原来如此,我还以为 while 循环是标准的一部分,看来还是稍微魔改了一下
    Bingchunmoli
        9
    Bingchunmoli  
       2022-10-04 11:24:11 +08:00 via Android
    @seers 因为不改的话,加密长度问题可能抛异常
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5289 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:51 · PVG 13:51 · LAX 22:51 · JFK 01:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.