有没有办法扩展Charm-Crypto方案来加密文件?

时间:2015-10-13 12:04:01

标签: python file encryption cryptography charm-crypto

据我所知,实现的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)

1 个答案:

答案 0 :(得分: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使用AES在CBC模式下使用随机IV和PKCS#7填充来加密数据。它在内部进行Base64编码,但是在JSON字符串中。此类不适合加密文件,因为文件数据必须完全加载到内存中,并且可能不适用于大文件。使用pyCrypto以使用渐进式加密来加密文件。

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