的一种进行加密揭秘行驶,能接受对密文开始运算,转为进行加密揭秘没想到,揭秘后与运作没想到相适配,就看起来它是在非对称加密上来执行的似的。 — Massimo Bertaccini( )
使用特殊的隐私同态加密其数据,使分时计算机无需先解密即可对数据进行操作。
换句话说,我想在不放弃访问权限的情况下删除对我的数据的处理。
换句话说, function(A, B) = function (A , B
) 其中 A and B
分别是 A 和 B 的加密值。这使第三方能够计算加密数据并在不知道原始值的情况下提供结果。使用 RSA,可以将使用相同密钥加密的两个值相乘,并且可以解密乘积以产生加密值的乘积。
书籍馆 | 方法 | 语气 | 资质证 |
---|---|---|---|
BFV、BGV、CKKS | C++/C# 包装袋器 | 麻省理工学基地 | |
开FHE | BFV、BGV、CKKS、DM、CGGI | C++ | BSD 2 免责条款经营证 |
CKKS | C++ | 理论知识公享 3.0 | |
TFHE(环面) | 锈 | BSD-3-Clause-清掉 | |
TFHE | 锈 | BSD-3-Clause-除去 | |
BFV、BGV、CKKS | 去 | 阿帕奇 2.0 | |
N/A – 的使用 SEAL、PALISADE、HLib | 蟒蛇,碼頭建筑工人 | 阿帕奇 2.0 |
首先,公钥由客户端创建并与服务器共享。它用于加密数据,也用于对加密数据进行算术运算。客户端和服务器都使用加密器。客户端生成并保留用于解密的私钥,该私钥由恰当命名的Decryptor使用。
using Microsoft.Research.SEAL; protected SEALContext _context; private KeyGenerator _keyGenerator; private Encryptor _encryptor; private Decryptor _decryptor; protected IFitnessTrackerApiClient _apiClient; . . . _context = SEALUtils.GetContext(_config.Value.PolyModulusDegree, this.SchemeType); _keyGenerator = new KeyGenerator(_context); _keyGenerator.CreatePublicKey(out PublicKey publicKey); _keyGenerator.CreateRelinKeys(out RelinKeys relinKeys); _encryptor = new Encryptor(_context, _publicKey); _decryptor = new Decryptor(_context, _keyGenerator.SecretKey); . . . PublicKeyModelCKKS keyModelCKKS = new( SEALUtils.KeyToBase64String(_publicKey), SEALUtils.KeyToBase64String(relinKeys)); await _apiClient.SendPublicKeyCKKSAsync(keyModelCKKS);
再线性化密钥从客户端传递到服务器。根据 Microsoft SEAL,除了减少乘法运算后的密文大小外,它们没有任何语义意义。
在命令提示符行,访客录入时和间距。
每个值都被编码为PlainText,然后加密为Ciphertext ,最后在将其发送到服务器之前编码为 base64。
using Microsoft.Research.SEAL; var plaintext = new Plaintext(); _encoder.Encode(value, _scale, plaintext); var ciphertext = new Ciphertext(); _encryptor.Encrypt(value, ciphertext); using (var ms = new MemoryStream()) { ciphertext.Save(ms); return Convert.ToBase64String(ms.ToArray()); }
RunItemCKKS metricsRequest = new( EncryptBase64(runItem.Distance), EncryptBase64(runItem.Time), EncryptBase64(1 / runItem.Time)); await _apiClient.AddNewRunningDistanceCKKSAsync(metricsRequest);
服务器执行类似的引导功能,仅使用公钥和重新线性化密钥创建SEALContext ,然后处理请求:
var distance = SEALUtils.BuildCiphertextFromBase64String(request.Distance, _sealContext); var time = SEALUtils.BuildCiphertextFromBase64String(request.Time, _sealContext); var timeReciprocal = SEALUtils.BuildCiphertextFromBase64String(request.TimeReciprocal, _sealContext); Ciphertext speed = new(); _evaluator.Multiply(distance, timeReciprocal, speed); _evaluator.RelinearizeInplace(speed, _relinKeys); _runListCKKS.Add(new EncryptedRunInfoCKKS(distance, time, speed));
时间的倒数用于计算提交运行的速度,并且RelinearizeInplace方法减少了生成的密文的大小。距离、时间和速度被保存到内存列表中。
GetMetrics方法聚合列表并返回:
public SummaryItemCKKS GetMetrics() { int count = _runListCKKS.Count; var totalDistanceCKKS = SumEncryptedValues(_runListCKKS.Select(m => m.Distance)); var totalTimeCKKS = SumEncryptedValues(_runListCKKS.Select(m => m.Time)); var totalSpeed = SumEncryptedValues(_runListCKKS.Select(m => m.Speed)); . . . protected Ciphertext SumEncryptedValues(IEnumerable<Ciphertext> encryptedData) { . . . Ciphertext encTotal = new(); _evaluator.AddMany(encryptedData, encTotal); return encTotal; . . . }
由于服务器跟踪运行提交的次数,因此运行总数不是加密值。该未加密的值可以转换为明文并用于对密文执行的操作。虽然这是一个简单的示例,但其含义值得注意。服务器可以提供用于加密数据的附加值,使第三方提供商能够将专有数据应用于针对客户提供的加密数据的计算。
在下面的示例中,总计数被转换为倒数并添加到List<double>。 CKKS 操作需要加密的列表值,即使列表只包含一个值。因此, List<double>被编码为PlainText 。 MultiplyPlainInplace将 totalSpeed 乘以(1/运行次数)得到平均速度。为了节省空间,将结果应用于 totalSpeed密文,并且重新线性化密钥减少了输出的大小。
Plaintext encodedCountReciprocal = new(); List<double> averagePaceList = new(); double runCountReciprocal = 1 / (double)count; averagePaceList.Add(runCountReciprocal); _encoder.Encode(averagePaceList, _scale, encodedCountReciprocal); _evaluator.MultiplyPlainInplace(totalSpeed, encodedCountReciprocal); _evaluator.RelinearizeInplace(totalSpeed, _relinKeys);
这些值在客户端进行 base64 编码、返回和解密。客户端采取额外的步骤将解密的明文转换为List<double> 。
var payload = Convert.FromBase64String(encryptedDistanceText); using var ms = new MemoryStream(payload); var ciphertext = new Ciphertext(); ciphertext.Load(_context, ms); var decryptedText = new Plaintext(); _decryptor.Decrypt(cypherText, decryptedText); List<double> distanceList = new(); _encoder.Decode(decryptedText, distanceList);
英里 | 時间 |
---|---|
2.5 | 0:35:32.643 |
2.2 | 0:32:48.826 |
2.8 | 0:34:52.036 |
Microsoft SEAL 是 Microsoft Research 项目,尚未准备好用于生产应用程序。所有类都实现IDisposable并使用非托管资源。生产代码需要防止内存泄漏。 SEALContext类不遵循单一职责原则。它包括 BGV/BVF 和 CKKS 的方法。此外,CKKS 支持向量运算,但不支持向量加法。单个List<double>可以加密为单个CipherText ,但无法对单个CipherText 中的值求和。它可以用来完成,但这是一个次优的解决方案。