Golang rsa oaep解密失败,前端使用webcrypto
我有这个应用程序写在Golang作为后端和Typescript作为前端。我需要对传输的数据进行加密,所以我选择RSA加密,基本步骤如下: *后端*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单独加密/解密就可以了
- 前端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]}