JPBC双线性映射加密场景下如何解密得到原始字符串明文
问题本质
你现在遇到的问题是双线性对加密(从代码逻辑看是CP-ABE属性基加密)的通用设计特性:GT群不存在能把任意长度字符串双向映射成群元素的原生方法,你调用的setFromHash是单向哈希映射函数,作用是把任意输入哈希后拟合到群元素空间,和普通SHA哈希一样不可逆,所以解密后自然只能得到哈希后的群元素,无法还原原始明文,这不是代码bug,是函数本身的设计决定的。
可行实现方案
以下方案都不需要把明文映射到群,也不需要引入AES这类对称加密算法:
- 方案1:密钥封装+异或掩码(工程通用方案,无明文长度限制)
你现有代码的加密核心是用一次性随机秘密值e(g,g)^(αs)做乘法掩码,只要把被掩码的对象从“哈希后的明文群元素”换成随机生成的临时群密钥即可,流程如下:- 加密时先生成一个随机GT群元素作为临时掩码密钥
k - 用标准KDF(密钥派生函数,比如HKDF,本质是带上下文的哈希运算,不属于对称加密)把
k派生为和明文等长的字节流,和原始明文字节做异或得到密文主体 - 把
k作为你原有代码里的message参数走ABE加密流程,将ABE输出的密文块和异或得到的密文主体拼接后传输 - 解密时先通过ABE解密拿到原始
k,用相同KDF派生出等长字节流,和密文主体异或就能直接得到原始字符串,全程不需要对明文做哈希映射,也没有对称加密运算。
- 加密时先生成一个随机GT群元素作为临时掩码密钥
- 方案2:可逆直接编码(仅适用于极短明文)
如果你的明文长度极短(比如不超过群阶对应字节长度的短ID、标识),可以自己实现双向编码规则:把明文字节按固定规则填充为GT群元素的合法坐标值,直接生成群元素参与运算,解密拿到群元素后反向按规则解析就能得到明文。但这个方案限制极强:明文长度不能超过群元素的有效编码空间,还要处理编码值不在群上的无效情况,除了特定短数据场景外基本不会用。
现有代码的问题说明
你当前的测试代码逻辑本身是自洽的,但因为用了单向哈希映射明文,永远无法还原原始字符串:
String msg = "dasddwhqoiuhdaiosnioacjijdqwi0jdaposdjiasojcbndusivbuiweshfsaoindoai"; // 这里的setFromHash是单向映射,不可逆 Element message = PairingFactory.getPairing(pairingParametersFileName).getGT().newElement().setFromHash(msg, 0, msg.length).getImmutable(); System.out.println("plaintext:" + msg); encrypt(pairingParametersFileName, message, accessTree, pkFileName, ctFileName); Element res = decrypt(pairingParametersFileName, accessTree, ctFileName, skFileName); System.out.println("decrypt:" + res); // 这里只能验证哈希后的群元素相等,拿不到原始msg字符串 if (message.isEqual(res)) { System.out.println("successful!"); }
加密核心逻辑里的乘法掩码本身是可逆的,问题出在明文进加密逻辑前就做了单向哈希:
Pairing bp = PairingFactory.getPairing(pairingParametersFileName); // ...省略公钥读取逻辑 Element s = bp.getZr().newRandomElement().getImmutable(); // 只要这里的message是单向哈希生成的,就不可能还原原始明文 Element CT = message.duplicate().mul(egg_alpha.powZn(s)).getImmutable(); Element C = g_beta.powZn(s).getImmutable();
需求可行性结论
完全可以在不使用对称加密的前提下实现你的需求,不需要引入AES、SM4等对称加密算法,只需要用KDF派生掩码+异或的方案即可,整个流程仅涉及群运算、哈希运算、异或运算,没有对称加密的密钥调度、轮变换等逻辑,符合你的要求。
内容的提问来源于stack exchange,提问作者echo-dundun
相关产品推荐
相关产品推荐

