WhatsApp宣布支持正常会话和群聊的端到端加密。
假设没有共享私钥并且它是真正的端到端,那么当我向一个有10个朋友的群组发送10MB视频时,我必须将其加密10倍并将其发送10倍?否则它对我来说不是端到端的,因为服务器一定不能转发它。
这是对的吗?感谢
答案 0 :(得分:6)
Whatsapp已实施PKI(公钥基础结构)以加密消息。这意味着客户端使用密钥对自身进行身份验证,并且服务器仅存储公钥。
有关whatsapp安全性的更多信息,请查看他们发布的以下白皮书:
https://www.whatsapp.com/security/WhatsApp-Security-Whitepaper.pdf
<强>答案强>
您的问题的答案在白皮书的第7页。
WhatsApp小组成员第一次向小组发送消息:
- 发件人生成一个随机的32字节 Chain Key 。
- 发件人生成随机的Curve25519 签名密钥密钥对。
- 发件人将32字节 Chain Key 和签名密钥中的公钥组合成发件人密钥消息。
- 发件人使用之前解释的成对消息传递协议单独加密发件人密钥给该组的每个成员
醇>对于该组的所有后续消息:
- 发件人从 Chain Key 中派生消息密钥,并更新 Chain Key 。
- 发件人使用CBC模式 AES256
对邮件进行加密- 发件人使用签名密钥签署密文。
- 发件人将单个密文消息发送给服务器,服务器向所有组参与者进行服务器端扇出。
醇>
答案 1 :(得分:0)
简单来说,我认为该组基本上是服务器上的共享墙,只有成员具有该组的对称加密密钥才能在共享墙上进行读写。将组的加密密钥安全地分发给正在将其添加到组的成员使用其自己的公共密钥添加的成员。服务器永远不会看到该组的加密密钥,并且由于该成员已被加密,因此无法读取成员在墙上写的内容。
class Group{
id,
symmetricEncryptionKey,
members
}
class User{
privateKey,
publicKey
Group createGroup(){
new Group(secureId(), symmetricKey(), [this])
}
addUserToGroup(group : Group, friend){
friend.send(encrypt(friend.publicKey(),JoinGroupRequest(group)))
}
joinGroup(group: Group){
saveToJoined(group) //symmetric key in particular to read the messages sent to group
}
sendMessage(groupId, message){
send(encrypt(encryptionKeyOf(groupId), message));
}
receiveMessage(groupId, encryptedMessage){
decrypt(encryptionKeyOf(groupId), encryptedMessage)
}
}