Golang rsa oaep解密失败,前端使用webcrypto

Golang rsa oaep解密失败,前端使用webcrypto,go,rsa,jwk,webcrypto,Go,Rsa,Jwk,Webcrypto,我有这个应用程序写在Golang作为后端和Typescript作为前端。我需要对传输的数据进行加密,所以我选择RSA加密,基本步骤如下: *后端* Golang生成私钥和公钥,保存在redis中 Golang使用将公钥转换为JWK(json web密钥) Golang发送JWK *前端* Typescript使用WebCryptoAPI导入JWK密钥 Typescript使用导入的密钥加密一些纯文本 加密后,我得到一个ArrayBuffer,为了防止任何编码问题,我将ArrayBuffer逐字节

我有这个应用程序写在Golang作为后端和Typescript作为前端。我需要对传输的数据进行加密,所以我选择RSA加密,基本步骤如下:

*后端*

  • Golang生成私钥和公钥,保存在redis中
  • Golang使用将公钥转换为JWK(json web密钥)
  • Golang发送JWK
  • *前端*

  • Typescript使用WebCryptoAPI导入JWK密钥
  • Typescript使用导入的密钥加密一些纯文本
  • 加密后,我得到一个ArrayBuffer,为了防止任何编码问题,我将ArrayBuffer逐字节转换为整数数组
  • 将转换后的整数数组发送到字符串化JSON内的后端
  • *后端*

  • Golang接收JSON并将整数数组转换为
    []字节
  • 从redis检索私钥,然后解密
  • 现在我得到的只是一个
    解密错误

    我检查过的东西:

    • 后端Golang单独加密/解密就可以了
    • 前端webcrypto单独加密/解密就可以了
    • 检查golang rsa.PublicKey->JWK期间是否出现任何问题

    • 如果前端从后端获取jwk
    • 导入它
    • 然后输出它
    • 将导出的密钥发送回后端
    • 后端将jwk转换回rsa公钥,它等于保存在redis中的公钥
    • 后端接收到int数组并将其转换为
      []字节后,其长度和内容与前端的长度和内容相同

    代码如下:

    
    func RSADecrypt(privateKey*rsa.privateKey,messageToDecrypt,cryptLabel[]字节)(decipherText[]字节,错误){
    如果privateKey==nil{
    返回nil,errors.New(“private不能为nil”)
    }
    如果messageToDecrypt==nil{
    返回nil,errors.New(“消息不能为nil”)
    }
    rng:=随机读卡器
    返回rsa.DecryptOAEP(sha256.New(),rng,privateKey,messageToDecrypt,cryptLabel)
    }
    func GenerateKeyPair()(privateKey*rsa.privateKey,publicKey*rsa.publicKey,错误){
    privateKey,err=rsa.GenerateKey(rand.Reader,bitSize)
    如果错误!=零{
    返回零,零,错误
    }
    返回privateKey和privateKey.PublicKey,无
    }
    func BytesToRSAPrivateKey(privateKeyBytes[]字节)(*rsa.PrivateKey,错误){
    如果privateKeyBytes==nil{
    返回nil,errors.New(“私钥字节不能为nil”)
    }
    块:=pem.Decode(privateKeyBytes)
    enc:=x509。IsEncryptedPEMBlock(块)
    b:=block.Bytes
    变量错误
    如果enc{
    log.Println(“是加密的pem块”)
    b、 err=x509。块(块,无)
    如果错误!=零{
    返回零,错误
    }
    }
    密钥,错误:=x509.ParsePKCS1PrivateKey(b)
    如果错误!=零{
    返回零,错误
    }
    返回键,无
    }
    ...
    func userLogin(userUUID字符串,loginUserInfo[]字节)错误{
    privateKeyInString,err:=适配器.Get(userUUID+“:privateKey”)
    如果错误!=零{
    返回错误
    }
    privateKey,err:=cred.BytesToRSAPrivateKey([]字节(privateKeyInString))
    如果错误!=零{
    返回错误
    }
    var userInfo结构{
    用户名字符串`json:“用户名”`
    EncryptedPassword[]int`json:“密码”`
    }
    err=json.Unmarshal(loginUserInfo和userInfo)
    如果错误!=零{
    返回错误
    }
    encryptedInBytes:=util.IntArrayToByteArray(userInfo.EncryptedPassword)
    fmt.Println(“加密长度:,len(加密字节))
    fmt.Println(加密字节)
    已解密,错误:=cred.RSADecrypt(私钥,encryptedInBytes,[]字节(“qp\U用户\U登录”))
    如果错误!=零{
    
    fmt.Println(“3,”,err)//好的,我的问题是客户端的arraybuffer到string和string到arraybuffer的转换。因为后端只处理
    []中的几乎所有内容字节
    字面上是字节数组,在前端执行转换时,始终使用
    Uint8Array
    而不是
    Uint16Array
    ,如下所示:

    str2ab(str:string):ArrayBuffer{
    const buf=新阵列缓冲区(str.length);
    const bufView=新的UINT8阵列(buf);
    for(设i=0,strLen=str.length;i
    更具体地说,在前端进行加密时的标签字段让我头痛不已

    一些旁注:在发送到后端之前,将加密数据从arraybuffer转换为int-array并不是明智之举,这就是base64编码的用途:

    uint8ArrayToBase64(buf:Uint8Array):字符串{
    让binaryStr=Array.prototype.map.call(buf,function(ch){
    返回字符串.fromCharCode(ch);
    }).加入(“”);
    返回btoa(二进制STR);
    }
    ...
    
    const encrypted=wait Crypto.encrypt(serverPublicKey、loginLabel、enteredPassword);//好的,我的问题是客户端上的arraybuffer到字符串和字符串到arraybuffer的转换。因为后端只处理
    []中的所有内容字节
    字面上是字节数组,在前端执行转换时,始终使用
    Uint8Array
    而不是
    Uint16Array
    ,如下所示:

    str2ab(str:string):ArrayBuffer{
    const buf=新阵列缓冲区(str.length);
    康斯特·布夫维
    
        -#@#!#!%%% stringify: 
        {"username":"ycx","password":[187,39,30,53,22,144,100,28,16,168,214,201,115,116,147,82,95,117,84,226,22,100,216,250,222,149,230,162,79,205,19,100,146,226,221,110,155,9,177,19,254,13,141,31,23,208,187,177,228,229,121,148,186,8,213,61,130,230,190,98,147,10,197,138,68,30,243,121,212,4,243,52,240,108,143,126,181,71,5,223,159,27,242,15,150,84,233,255,218,194,151,183,203,158,199,246,128,122,6,45,137,252,48,30,80,150,100,121,158,240,96,164,45,142,110,182,98,230,107,198,142,250,107,38,224,152,228,195,0,38,102,208,216,5,138,67,249,110,171,49,84,195,42,29,74,147,56,233,193,168,189,142,110,24,16,188,210,20,149,44,172,100,1,119,4,21,81,121,26,98,2,163,219,225,218,186,144,220,78,243,212,5,66,40,116,160,147,128,41,201,194,0,74,69,116,204,202,88,204,86,16,164,16,8,142,36,154,189,228,144,61,233,128,247,80,95,190,39,82,34,155,197,130,74,215,73,6,240,37,158,130,11,66,192,54,252,197,71,247,69,115,202,234,30,57,192,254,136,150,71,149,231,207,237,108,217]}