保形加密(FPE)
算法介绍:knowuv.com/blog/fpe_encryption
php实现:github.com/Ivinco/crypto-ff3-php
java实现:github.com/mysto/java-fpe
go实现:github.com/dusty-cjh/golang-fpe
示例代码:
package FF3;
import com.privacylogistics.FF3Cipher;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import java.io.IOException;
/**
* <a href="https://github.com/mysto/java-fpe">Java 中的格式保护加密</a>
*/
public class FF3 {
public static void main(String[] args) throws IOException, IllegalBlockSizeException, BadPaddingException {
String key = "EF4359D8D580AA4F7F036D6F04FC6A94"; //FPE保形算法密钥,必须为随机(16|24|32)字节的hex大写字符串
String tweak = "74656E616E745F31"; //FPE保形算法Tweak,必须为随机8字节的hex大写字符串
FF3Cipher f3 = new FF3Cipher(key, tweak);
System.out.println(encrypt(f3, 132) + " " + decrypt(f3, encrypt(f3, 132)));
System.out.println(encrypt(f3, 13456941) + " " + decrypt(f3, encrypt(f3, 13456941)));
System.out.println(encrypt(f3, 4294967295L) + " " + decrypt(f3, encrypt(f3, 4294967295L)));
}
public static long encrypt(FF3Cipher f3, long userId) throws IllegalBlockSizeException, BadPaddingException {
String userIdStr = String.format("%06d", userId);
return Long.parseLong(f3.encrypt(userIdStr));
}
public static long decrypt(FF3Cipher f3, long userId) throws IllegalBlockSizeException, BadPaddingException {
String ret = f3.decrypt(String.valueOf(userId));
return Long.parseLong(ret);
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu