公開鍵を生成するサーバー側のコードは次のとおりです。
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return nil
}
publicKey := &privateKey.PublicKey
publicKeyBytes, err := json.Marshal(publicKey)
privateKeyBytes,err:=json.Marshal(privateKey)
秘密鍵はサーバー側のメモリに格納されたシングルトンであり、公開鍵はそれを要求したクライアントに返される別のシングルトンです。
次に、クライアント (ここでは Web ブラウザー) がサーバーの公開鍵でデータを暗号化します。
cookieParts=document.cookie.split('pk=')
if(cookieParts.length==1)
{
serverPublicKey= unescape(cookieParts[0].split(';')[0].toString())
}
else
{
serverPublicKey= unescape(cookieParts[1].split(';')[0].toString())
}
serverPublicKey =serverPublicKey.replace(/([\[)?(\d+)([,\}\]])/g, "$1\"$2\"$3");
serverPublicKey = JSON.parse(serverPublicKey)
var rsa_key = {
"n":btoa(serverPublicKey.N).replace(/=/g, ''),
//Maybe the above line causes the problem.But I couldn't find any other way.
"e": 65537,
};
var cryptographer = new Jose.WebCryptographer();
cryptographer.setKeyEncryptionAlgorithm("RSA-OAEP");
cryptographer.setContentEncryptionAlgorithm("A128GCM");
cryptographer.setContentEncryptionAlgorithm("A128CBC-HS256");
var public_rsa_key = Jose.Utils.importRsaPublicKey(rsa_key, "RSA-OAEP");
var encrypter = new JoseJWE.Encrypter(cryptographer, public_rsa_key);
str="test"
encrypter.encrypt("sara").then(function(data) {
$scope.params.Param1=data
TestService.SendParamToServer($scope.params).then(function(result){
console.log("success")
}).catch(function(error){
console.log("error")
})
そして、サーバーは、上記のコードで暗号化されたばかりのデータを復号化するために疲れます。
jweString = string(p.Param1)
jwe, err = jose.ParseEncrypted(jweString)
if err != nil {
panic(err.Error())
}
data, err := jwe.Decrypt(services.NewSecurityService().GetPrivateKey())
if err != nil {
// The error is not nil:
// square/go-jose: error in cryptographic primitive
panic(err.Error())
}
しかし残念ながら、次のエラーが発生します。
square/go-jose: error in cryptographic primitive