Toplu verilerin toplanması, bilişimdeki en kârlı endüstrilerden biridir, ancak kullanıcı gizliliğini ihlal etmeden verileri nasıl verimli bir şekilde toplayabiliriz? Çok Taraflı Dağıtılmış Toplama Protokolü (DAP) bir cevaptır ve PRIO3 yöntemi bu konuda en iyilerden biridir.
Güvenlik, veriler dinlenirken ve havada aktarılırken uygulanmış olsa da, genellikle hesaplamalarımızı hala düz metin verileri üzerinde yapıyoruz. Bu, özellikle işlemcinin KŞB (Kişisel Olarak Tanımlanabilir Bilgi) ve gizli şifreleme anahtarları gibi şeyleri belirleyebilmesi gibi birçok soruna yol açar. Bir yaklaşım, MPC (Çok Taraflı Hesaplama) kullanmaktır ve burada hesaplamamızı daha küçük bloklara ayırabilir ve tarafların her birine hesaplamanın bir payını verebiliriz. Bunun en iyi uygulamalarından biri, istatistikleri gizliliği gözeterek toplamaktır.
Örneğin, bir cep telefonu üreticisi, telefonlarının sahiplerinin cinsiyet dengesini belirlemek isteyebilir, ancak aslında belirli bir kişiyi ifşa etmek istemez. Bunun için, her istemci cihazı cinsiyetleri için bir SNIP (gizli paylaşımlı etkileşimsiz kanıt) oluşturur. PRIO3 içinde bu, hızlı ve verimli bir sıfır bilgi kanıtıdır. Daha sonra sunucular bu SNIP'leri alabilir ve geçerliliklerini kontrol edebilir. Kontrol edildikten sonra, mevcut istatistik toplaması için yerel akümülatörlerini güncelleyebilirler. Daha sonra, istemci cihazlarından cinsiyet dengesini ortaya çıkarmak istediğimizde, toplama toplamlarını yayınlayabilirler:
Genel olarak, sunucuların hiçbiri, müşterinin erkek mi yoksa kadın mı olduğunu belirleyemez, çünkü cinsiyetlerinin sıfır bilgi kanıtı oluşturulur; ancak, yine de toplamı hesaplayabiliriz. PRIO3 ile sunucuların hiçbiri düz metin verilerini görmez ve klasik bir makaleye dayanır [here][1]:
PRIO3 uygulaması, genellikle gizlilik ölçümü için Çok Taraflı Dağıtılmış Toplama Protokolünün (DAP) bir parçası olarak görülebilir ve şu anda IETF ile standardizasyon için ilerlemektedir [here]:
Boolean değerleri (sayım) için bir dizi pay oluşturmak ve ardından verileri geri toplamak için PRIO3'ü kullanacağız. Temel analiz, bir şeyin Doğru mu Yanlış mı olduğuna dair temel bir sayıdır ve veri kümesi {true, false, true, true} şeklindedir ve doğru değerlerin sayısını sayacaktır [here]:
package main
import (
"fmt"
"crypto/rand"
"os"
"io"
"strconv"
"github.com/cloudflare/circl/vdaf/prio3/count"
)
func fromReader[T any](r io.Reader) (z T) {
switch zz := any(&z).(type) {
case *count.Nonce:
_, _ = r.Read(zz[:])
case *count.VerifyKey:
_, _ = r.Read(zz[:])
}
return
}
var Context = []byte("Test")
func main() {
NumShares := uint8(2)
input := []bool{true,false,true, true}
argCount := len(os.Args[1:])
if argCount > 0 {
a,_ := strconv.Atoi(os.Args[1])
NumShares=uint8(a)
}
c, _ := count.New(NumShares, Context)
params := c.Params()
shares := params.Shares()
aggShares := make([]count.AggShare, shares)
for i := range aggShares {
aggShares[i] = c.AggregateInit()
}
for _, mi := range input {
nonce := fromReader[count.Nonce](rand.Reader)
verifyKey := fromReader[count.VerifyKey](rand.Reader)
randb := make([]byte, params.RandSize())
_, _ = io.ReadFull(rand.Reader, randb)
var pubShare count.PublicShare
var inputShares []count.InputShare
pubShare, inputShares, _ = c.Shard(mi, &nonce , randb)
var prepStates []*count.PrepState
var outboundPrepShares []count.PrepShare
for i := range shares {
state, share, _ := c.PrepInit(&verifyKey, &nonce, i, pubShare, inputShares[i])
prepStates = append(prepStates, state)
outboundPrepShares = append(outboundPrepShares, *share)
}
var prepMsg *count.PrepMessage
prepMsg, _ = c.PrepSharesToPrep(outboundPrepShares)
var outShare *count.OutShare
for i := range shares {
outShare,_ = c.PrepNext(prepStates[i], prepMsg)
c.AggregateUpdate(&aggShares[i], outShare)
}
}
numMeas := uint(len(input))
aggResult, _ := c.Unshard(aggShares, numMeas)
fmt.Printf("Inputs: %v\n\n", input)
fmt.Printf("Number of inputs: %d\n\n", numMeas)
fmt.Printf("Number of shares: %d\n\n", NumShares)
fmt.Printf("Aggregated Count %d\n\n", *aggResult)
for i := range shares {
fmt.Printf("Share %v\n", aggShares[i])
}
}
Ve örnek bir çalıştırma [here]:
Inputs: [true false true true]
Number of inputs: 4
Number of shares: 4
Aggregated Count 3
Share {[[7227276485192055052]]}
Share {[[673113590378828220]]}
Share {[[14679250781088487564]]}
Share {[[14313847295054699691]]}
Bir toplama örneği burada:
PRIO3 for Verifiable Distributed Aggregation Functions for Summation with GoVe bir histogram için:
PRIO3 for Verifiable Distributed Aggregation Functions for Histograms with Go[1] Corrigan-Gibbs, H., & Boneh, D. (2017). Prio: Private, robust, and scalable computation of aggregate statistics. In 14th USENIX symposium on networked systems design and implementation (NSDI 17) (pp. 259–282).