JMeter使用Groovy编写RSA公钥加密脚本运行报错问题咨询
问题根因
当前报错直接触发原因是Groovy语法大小写敏感:
- 你定义公钥规则的变量名为
x509PublicKey(Key首字母大写),但调用generatePublic方法时传入的参数写为x509Publickey(key首字母小写),变量名不匹配直接抛出属性不存在的异常。
除了这个直接拼写错误,代码里还有4个隐藏问题,修正大小写后依然会运行失败:
- 公钥字符串无效:你代码里写的公钥是随意拼接的占位字符串,不符合X509格式RSA公钥的Base64编码规范,实际使用需要替换为服务端下发的真实公钥,注意要去掉公钥头尾的
-----BEGIN PUBLIC KEY-----、-----END PUBLIC KEY-----标识和所有换行符,只保留中间的Base64内容。 - Base64编码方法名拼写错误:字节数组转Base64字符串的正确方法是
encodeBase64(),你写的encodedBase64()多了一个字母d,运行时会抛出方法不存在异常。 - 加密算法未指定填充模式:直接写
Cipher.getInstance('RSA')会使用JDK默认的填充模式,不同JDK版本、不同服务商实现的默认值不一致,大概率出现服务端无法解密的问题,需要明确指定通用填充规则。 - 明文中的转义字符未处理:代码里的
"是HTML转义的双引号,实际加密时要替换为真实的双引号,否则加密后的内容会包含多余转义字符,和服务端预期明文不匹配。
修正后可直接运行的代码
import javax.crypto.Cipher import java.security.KeyFactory import java.security.spec.X509EncodedKeySpec import org.apache.commons.codec.binary.Base64 // 替换为去除头尾标识、换行后的真实RSA公钥Base64字符串 def publicKeyContent = '替换为你的真实公钥内容' X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyContent)) KeyFactory keyFactory = KeyFactory.getInstance("RSA") def publicKey = keyFactory.generatePublic(pubKeySpec) // 待加密明文,已替换HTML转义字符为真实双引号 def plainContent = '("testinga@gmail.com|testingb@gmail.com").' // 明确指定加密算法、工作模式、填充规则,避免跨环境兼容问题 Cipher encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey) byte[] encryptedBytes = encryptCipher.doFinal(plainContent.getBytes("UTF-8")) // 正确调用Base64编码方法 def encryptedResult = Base64.encodeBase64String(encryptedBytes) vars.put("encodedMessage", encryptedResult)
额外排错提示
- 如果替换真实公钥后抛出
InvalidKeySpecException,先检查公钥格式:如果拿到的公钥开头是-----BEGIN RSA PUBLIC KEY-----,说明是PKCS#1格式,Java原生KeyFactory不支持直接解析,需要先转换为X509格式后再使用。 - RSA加密有明文长度限制:2048位密钥搭配PKCS1Padding时,单次最大加密明文长度为245字节,如果待加密内容超过长度,需要做分段加密处理。
内容的提问来源于stack exchange,提问作者Sri Ganesh
相关产品推荐
相关产品推荐

