我对pyhton和密码模块相对较新,因此我正在尝试学习加密和解密的基础知识。 当我加密文件并在同一程序上对其解密时,一切都很好,但是如果我尝试对预加密的文件运行解密代码(当然,我使用相同的密钥),则会收到InvalidSignature错误,随后通过InvalidToken。
现在,我认为由于某种原因密钥不匹配,但是它们确实是相同的。 然后,我认为由于某种原因我正在将字符串而不是字节传递给函数,或者存在某种转换错误,可能会更改加密的消息。但是加密-解密代码有效,所以我不知道为什么仅解密应该面临错误。 最后,我看了解密功能的源代码,并试图弄清楚时间戳是否与我得到的错误有关,但是由于我不太有经验,所以我没有得到任何相关信息。 这是加密-解密代码:用户输入密码后,它将加密并打印文件,该文件可以立即解密。
library(purrr)
# This is how I imported your example JSON
result <- fromJSON("~/Desktop/test.JSON", simplifyVector = F)
# Note that I set simplifyVector = F so that a list is returned
result2 <- result %>%
map(purrr::flatten) %>%
map(purrr::flatten) %>%
map_dfr(purrr::flatten)
print(result2)
# A tibble: 2 x 5
dateTime eventName distance fuel vehicleType
<dbl> <chr> <int> <int> <chr>
1 1556368322971 sampleEvent 350 300 NA
2 1556368322971 sampleEvent 360 290 bus
现在,它工作得很好,我得到了包含加密和解密消息的两个文件。 如果我删除了:
import base64
import os
from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
print("Insert password: ")
password_str = input()
password = password_str.encode()
salt = os.urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt,
iterations=100000, backend=default_backend())
key = base64.urlsafe_b64encode(kdf.derive(password))
f = Fernet(key)
message = "A really secret message. Not for prying eyes.".encode()
token = f.encrypt(message)
file = open("text_encrypted.txt", "wb")
file.write(token)
file.close()
file = open("text_encrypted.txt", "rb")
data = file.read()
file.close()
token = f.decrypt(data)
file = open("text_decrypted.txt", "wb")
file.write(token)
file.close()
部分,我应该只剩下一个解密代码,该代码应在以前生成的加密文件上工作,并应使用相同的密码解密。
我显然缺少了一些琐碎的东西,因为它同时引发了无效签名和无效令牌。 谢谢您的帮助
答案 0 :(得分:0)
您使用的加密密钥是PBKDF2的结果。为了使PBKDF2返回相同的加密密钥,它必须获得完全相同的参数。其中包括盐,在您的示例中,盐是每次随机生成的。
您需要将生成的盐与加密的文件存储在一起,以便以后对其进行解密。