1

据我所知,实现的 Charm 方案仅允许您加密随机生成的组元素或编码为组元素的 msg 字符串。但是这些也有局限性,因为群元素的顺序是从素数推导出来的。

有没有办法扩展魅力方案来加密文件?

根据 Artjom B 的评论编辑:

def encrypt(self, pk, M, object):
    key = self.group.random(GT)
    c1 = abenc.encrypt(pk, key, object)
    # instantiate a symmetric enc scheme from this key
    cipher = AuthenticatedCryptoAbstraction(sha1(key))
    c2 = cipher.encrypt(M)
    return { 'c1':c1, 'c2':c2 } 


f = open(pth,'r')
message = f.read()
pk, mk = abenc.setup() 
att_list=['TWO','FOUR']
access_policy = '((four or three) and (two or one))'  
sk = abenc.keygen(pk, mk, att_list)     
ct = encrypt(pk, message, access_policy)
4

1 回答 1

2

当需要加密任意数据时,需要通过使用非对称密码系统加密随机元素,然后从随机元素派生对称密钥来应用混合加密,以便使用生成的密钥加密实际数据。

Charm crypto 提供了一个 AES 版本来加密任意消息/数据:

from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
from charm.toolbox.symcrypto import AuthenticatedCryptoAbstraction, SymmetricCryptoAbstraction
from charm.core.math.pairing import hashPair as extractor

group = PairingGroup("SS512")

r = group.random(G1)
msg = b"This is a secret message that is larger than the group elements and has to be encrypted symmetrically"

symcrypt = AuthenticatedCryptoAbstraction(extractor(r)) # or SymmetricCryptoAbstraction without authentication

# encryption
ciphertext = symcrypt.encrypt(msg)

# decryption
recoveredMsg = symcrypt.decrypt(ciphertext)

assert msg == recoveredMsg
print(recoveredMsg)

extractor()函数实际上是元素字节的 SHA-256 哈希,因此可以处理所有类型的元素。

SymmetricCryptoAbstraction在 CBC 模式下使用 AES 加密数据,并使用随机 IV 和 PKCS#7 填充。它在内部进行了 Base64 编码,但转换为 JSON 字符串。此类不适合加密文件,因为文件数据必须完全加载到内存中,并且可能不适用于大文件。使用 pyCrypto 以渐进式加密方式加密文件。

您必须创建自己的文件格式,以便将非对称密文组件和对称密文组件并排放置。

于 2015-10-13T12:49:40.013 回答