为什么在Java和Go之间解密JWE时出错

为什么在Java和Go之间解密JWE时出错,java,go,jwt,jwe,Java,Go,Jwt,Jwe,我无法使用曲线P521、ECDH-ES和A256GCM在Java和Go中使用相同的曲线X、Y和D值进行加密/解密。当我尝试从Go获取加密值并在Java中进行解密时,它失败了,反之亦然,它失败了: Go:square/Go-jose:加密原语中的错误 Java:AES/GCM/NOP添加解密失败:GCM中的mac检查失败 这不起作用的原因是什么 !!!更新!!!我还添加了解析JWK的代码,以便在Go中创建我的密钥对。(我使用java程序并将密钥对打印为json) 我注意到,有时Java加密值可以在

我无法使用曲线P521、ECDH-ES和A256GCM在Java和Go中使用相同的曲线X、Y和D值进行加密/解密。当我尝试从Go获取加密值并在Java中进行解密时,它失败了,反之亦然,它失败了:

Go:square/Go-jose:加密原语中的错误

Java:AES/GCM/NOP添加解密失败:GCM中的mac检查失败

这不起作用的原因是什么

!!!更新!!!我还添加了解析JWK的代码,以便在Go中创建我的密钥对。(我使用java程序并将密钥对打印为json)

我注意到,有时Java加密值可以在Go中解析,有时则不能。我认为GCM解密中有一些东西在Go中可能无法正常工作

主程序包
进口(
“加密/ecdsa”
“加密/椭圆”
“加密/x509”
“编码/pem”
“fmt”
“日志”
“数学/大”
“操作系统”
b64“编码/基本64”
//“github.com/contiamo/jwt”
gojose“gopkg.in/square/go jose.v2”
//jwtgo“github.com/dgrijalva/jwtgo”
)
func main(){
testgojmx()
}
func testgojmx(){
纯文本:=[]字节(“测试字符串”)
xEnc:=“AVUFSNO89WJ5XT2Z63IznxVO8H5GSCFCHMS1XJ_JbfEzIsudqjrvKGrzxJT96-dmP_NY7KeMvyJEUInmqcqCWbzcQ”
yEnc:=“ANv5hayQ3_TwMcFqPrtw-a9WnkfquynuwhhbwoxyvgardvidgyriRx3O5gajfyumpibzfq0K0JRJB09YP3AVBTC”
dEnc:=“AGPOHUDXAJYYRLV0BAOKQTNDZLO7KJS1ZSUCSU69CGFSWPG7OXSXLPTAPD-5O47d1PX3y0ag5228XsPFXVzYnH0”
x:=新的(big.Int)
temp,wk:=b64.URLEncoding.DecodeString(xEnc)
x=x.SetBytes(温度)
y:=新的(big.Int)
temp,=b64.URLEncoding.DecodeString(yEnc)
y=y.SetBytes(温度)
d:=新的(big.Int)
temp,=b64.URLEncoding.DecodeString(dEnc)
d=d.SetBytes(温度)
PrivateKey:=new(ecdsa.PrivateKey)
privkey.PublicKey.Curve=椭圆.P521()
privkey.D=D
privkey.PublicKey.X=X
privkey.PublicKey.Y=Y
//在这方面,我们的工作重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:这些工作的重点是:他们的重点是:他们的重点是:他们的重点是:例如,例如,例如,例如,例如,例如,例如,例如,例如,例如,例如,例如,例如,例如,例如,例如,他们的一个在这方面,例如,例如,例如,他们的意思是作为作为作为作为作为一个非非政府的一个5个5个5.5个非非政府工作的5个作为作为作为作为作为作为作为作为作为作为作为一个5个5个中国的5个中国的5个中国的5个政府的5个证监会,作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为一个5个5个5个证监会的5个5}`
//jwkSet,err:=jwk.ParseString(javaKey)
//如果错误!=零{
//恐慌(错误)
//}
//键,错误:=jwkSet.Keys[0]。具体化()
//如果错误!=零{
//恐慌(错误)
//}
//私钥:=密钥。(*ecdsa.PrivateKey)
fmt.Printf(“X:%d\nY:%d\nD:%d\n”,privkey.X,privkey.Y,privkey.d)
encrypter,err:=gojose.NewEncrypter(gojose.A256GCM,gojose.Recipient{算法:gojose.ECDH_èES,密钥:privkey.Public()},nil)
如果错误!=零{
恐慌(错误)
}
加密,错误:=加密程序。加密(明文)
如果错误!=零{
恐慌(错误)
}
fmt.Printf(“加密=%v\n”,加密的.Header)
compact,err:=encrypted.CompactSerialize()
如果错误!=零{
恐慌(错误)
}
//紧凑型="EYJLCGSIONSIA3R5IJIOURUMILJJJJJJJNY2WmDPDefJseH10VEM0SYUC1AZMDR2XLWmXjdTzFyCWX5WKH5MxPfOEVMWxNm0F6YL6UgFmWpQ4LwWPL2TwWuWuVmTvzRkT05LexHmFmJpGpGpQ0Zd0ZdRkWnWn1Wf1Wf1Wf1Wf1Wf1Wf1FmJd4FmJv6FmJd1FmJd4FmFmFmFv6YFmJ4FmFmFv6YFv6Id1FmJ4Ff4FmFmFmJ4FmFmFmWfIdWfIdWfIdWfIfIfIfI4sd5muL9Ony.TOMCKHHWd20nPU8.nn6mbyremeyna50yjgvuq“
fmt.Printf(“压缩加密:%v\n”,压缩)
msg,:=gojose.ParseEncrypted(压缩)
fmt.Printf(“来自加密邮件:%v\n”,msg.Header)
已解密,错误:=msg.Decrypt(privkey)
fmt.Printf(“解密类型:%s\n”,已解密)
}
@springboot应用程序
公共类EcdhjweApplication实现CommandLineRunner{
专用静态记录器日志=LoggerFactory
.getLogger(EcdhjweApplication.class);
静态ECKey exposedJWK=generateECKeyJwk();
公共静态void main(字符串[]args){
run(EcdhjweApplication.class,args);
}
@凌驾
公共无效运行(字符串…参数){
LOG.info(“正在执行:命令行运行程序”);
试一试{
System.out.println(“D:\n”+exposedJWK.toECPrivateKey().get());
System.out.println(“X:\n”+exposedJWK.toECPublicKey().getW().getAffineX());
System.out.println(“Y:\n”+exposedJWK.toECPublicKey().getW().getAffineY());
}捕获(JoseeException e){
e、 printStackTrace();
}
System.out.println(“=====================================================================================================================================”);
字符串encryptedRequest=null;
试一试{
encryptedRequest=encryptJWE(“测试字符串”,exposedJWK.toecPublicey());
}捕获(例外e){
e、 printStackTrace();
}
System.out.println(“加密请求::”+encryptedRequest);
//encryptedRequest=”根据《气候变化法》的规定,气候变化是由气候变化引起的。气候变化是由气候变化引起的,气候变化是由气候变化引起的,气候变化是由气候变化引起的,气候变化是由气候变化引起的u9mjl02agPG.QPV7DKPV77hiLJ8.SBGhv8JRJTl_adfFNxgO0Q”;
System.out.println(“==========================================================================================================”);
字符串decryptedDetails=null;
试一试{
decryptedDetails=decryptJWE(encryptedRequest,exposedJWK.toECPrivateKey());
}捕获(例外e){
e、 printStackTrace();
}
System.out.println(“解密请求::”+解密细节);
}
//私有静态字符串encryptJWE(JSONObject有效负载,ECPublicKey ECPublicKey)引发异常{
私有静态字符串encryptJWE(字符串负载,ECPublicKey ECPublicKey)引发异常{
//构建JWE头文件
JWEHeader=new