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

2022-10-04 09:27:16 +08:00
 seers

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

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", "");
  }
2680 次点击
所在节点    Java
9 条回复
liprais
2022-10-04 09:36:10 +08:00
RSA/ECB/PKCS1Padding
这不都写了
seers
2022-10-04 09:39:21 +08:00
@liprais 我在用 go 重写某个接口,其中会用到这个校验,但是我调用 go 的标准 rsa 实现访问接口一直报错
liprais
2022-10-04 10:07:20 +08:00
@seers 很显然你写的跟 java 的实现不一样,我猜问题出在 padding 上
wangsongyan
2022-10-04 10:08:49 +08:00
贴出 go 代码和对应的 Java 明文、key 、密文更好解决
eason1874
2022-10-04 10:16:53 +08:00
很明显是内置标准 RSA 库,但他是分块加密,然后再把结果拼接起来,所以你解密的时候也要分块

MAX_ENCRYPT_BLOCK 是它明文块长度,根据它可以算出密文块有多长,不过代码里应该还有对应的 MAX_DECRYPT_BLOCK 表示密文块有多长,直接看那个就行
seers
2022-10-04 10:23:54 +08:00
lysS
2022-10-04 10:26:26 +08:00
最后对密文算了 base64 的,要用 DecryptPKCS1v15 进行解密
seers
2022-10-04 10:30:04 +08:00
@eason1874 原来如此,我还以为 while 循环是标准的一部分,看来还是稍微魔改了一下
Bingchunmoli
2022-10-04 11:24:11 +08:00
@seers 因为不改的话,加密长度问题可能抛异常

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884572

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX