python中的Fernet类加密和java中的解密不起作用

Vai*_*Vai 3 python java cryptography python-3.x

我正在尝试编写用于在 Python 中加密和在 Java 中解密的代码,但出现错误。

cryptography.fernet在 python 中使用来加密文件,当我Fernet Java用于解密时,它显示一个错误。

这是我的python代码:

from cryptography.fernet import Fernet


key = Fernet.generate_key()
cipher_suite = Fernet(key)


with open("key.txt", "wb") as f:
    f.write(key)

with open("read_plain_text_from_here.txt", "r") as f:
    encoded_text = f.read().encode()
    cipher_text = cipher_suite.encrypt(encoded_text)

with open("write_cipher_text_here.txt", "wb") as f:
    f.write(cipher_text)

with open("write_cipher_text_here.txt", "rb") as f:
    cipher_text = f.read()

with open("key.txt", "rb") as f:
    decryption_key = f.read()

with open("write_plain_text_here.txt", "wb") as f:
    cipher_suite = Fernet(decryption_key)
    f.write(cipher_suite.decrypt(cipher_text))
Run Code Online (Sandbox Code Playgroud)

这是我的Java代码:

package encryptapp;
import com.macasaet.fernet.*;


  public class Decrypt
  {
    public static void main(String args[])
    {       
        final Key key = new Key("***key i got from python**");
        final Token token = Token.fromString("***cipher text i got from python***");
        final Validator<String> validator = new StringValidator() {};
        final String payload = token.validateAndDecrypt(key, validator);
        System.out.println("Payload is " + payload);
    }
  }
Run Code Online (Sandbox Code Playgroud)

我得到的 Java 错误是:

Exception in thread "main" com.macasaet.fernet.TokenExpiredException: Token is expired
    at com.macasaet.fernet.Token.validateAndDecrypt(Token.java:240)
    at com.macasaet.fernet.Validator.validateAndDecrypt(Validator.java:104)
    at com.macasaet.fernet.Token.validateAndDecrypt(Token.java:218)
    at encryptapp.Decrypt.main(Decrypt.java:60)
Run Code Online (Sandbox Code Playgroud)

文档链接:

Python:https : //cryptography.io/en/latest/

Java:https : //github.com/l0s/fernet-java8/blob/master/README.md

Jam*_*olk 5

fernet-java8像Python类不类没有一个明确的说法TTL解密。相反,它的默认值为 60 秒。您需要覆盖接口的getTimeToLive()方法Validator以指定自定义 TTL。如果要将 TTL 设置为“永远”,这相当于ttl=Nonepython fernet 中的关键字参数,请执行以下操作:

import java.time.Duration;
import java.time.Instant;
.
.
.
@Override
final Validator < String > validator = new StringValidator() {
    public TemporalAmount getTimeToLive() {
        return Duration.ofSeconds(Instant.MAX.getEpochSecond());
    }
};
Run Code Online (Sandbox Code Playgroud)