Files
2026-05-27 23:03:00 +08:00

67 lines
1.7 KiB
Go

package outsource
import (
"crypto/rand"
"io"
"math/big"
"xdx.jelly/xgcl/he/paillier"
"xdx.jelly/xgcl/sm/sm2"
)
var nGx = new(big.Int).Set(sm2.BaseX())
var nGy = new(big.Int).Sub(sm2.Prime(), sm2.BaseY())
// OSDecrypt 外包服务器使用签名密钥解密, C1 = (x,y)
func OSDecrypt(encryptedKey *paillier.Cipher, paiPubKey *paillier.PublicKey, xC1 *big.Int, yC1 *big.Int, rnd io.Reader) (*paillier.Cipher, *big.Int, *big.Int, error) {
var k1, k2 *big.Int
var err error
for {
k1, err = rand.Int(rnd, sm2.OrderN())
if err != nil {
return nil, nil, nil, err
}
if k1.Sign() > 0 {
break
}
}
for {
k2, err = rand.Int(rnd, sm2.OrderN())
if err != nil {
return nil, nil, nil, err
}
if k2.Sign() > 0 {
break
}
}
xF, yF := sm2.Curve256.ScalarMult(xC1, yC1, k1.Bytes())
k1.ModInverse(k1, sm2.OrderN())
blind, err := paiPubKey.Encrypt(k2.Mul(k2, sm2.OrderN()), rnd)
if err != nil {
return nil, nil, nil, err
}
E := new(paillier.Cipher).HomomorphicScalarMul(encryptedKey, k1, paiPubKey)
E.HomomorphicAdd(E, blind, paiPubKey)
return E, xF, yF, nil
}
type ClientDecContext struct {
}
// 客户端先把(x,y) = C1发送给外包服务器
func (*ClientDecContext) Step1(E *paillier.Cipher, xF, yF *big.Int, paiPrivKey *paillier.PrivateKey) (*big.Int, *big.Int, error) {
e, err := paiPrivKey.Decrypt(E)
e.Mod(e, sm2.OrderN())
if err != nil {
return nil, nil, err
}
x, y := sm2.Curve256.ScalarMult(xF, yF, e.Bytes())
return x, y, nil
}
func (*ClientDecContext) Step2(cipher *sm2.Cipher, x, y *big.Int) ([]byte, error) {
ny := new(big.Int).Sub(sm2.Prime(), cipher.Y)
xJ, yJ := sm2.Curve256.Add(x, y, cipher.X, ny)
return sm2.Decrypt_aux(xJ, yJ, cipher)
}