首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于Bouncy城堡的Java格式保护加密(FPE)

基于Bouncy城堡的Java格式保护加密(FPE)
EN

Stack Overflow用户
提问于 2021-09-17 07:48:26
回答 2查看 842关注 0票数 0

发行说明发布: 1.69 (2021年6月7日)

将SP80038G中的两个FPE算法FF1和FF3-1的实现添加到轻量级API和JCE中。

这些都可以在bcprov-jdk15on JAR中找到。

下面是试图使用它的代码:

代码语言:javascript
运行
AI代码解释
复制
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.crypto.AlphabetMapper;
import org.bouncycastle.crypto.util.BasicAlphabetMapper;
import org.bouncycastle.jcajce.spec.FPEParameterSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.testng.annotations.Test;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;

@Slf4j
public class AesFpe {

    @Test
    public void testAesFpe() throws Exception {
        SecretKey key = generateKey();
        byte[] tweak = getTweak();
        int radix = getRadix("0123456789");
        Charset encoding = StandardCharsets.UTF_8;
        byte[] plaintext = "510123456".getBytes(encoding);
        Cipher cipher = Cipher.getInstance("AES/FF3-1/NoPadding", new BouncyCastleProvider());
        byte[] ciphertext = encrypt(cipher, key, tweak, radix, plaintext);
        log.info("Ciphertext: {}", new String(ciphertext));
        byte[] decrypted = decrypt(cipher, key, tweak, radix, ciphertext);
        assertThat(decrypted, equalTo(plaintext));
    }

    public byte[] encrypt(Cipher cipher, SecretKey key, byte[] tweak, int radix, byte[] plaintext) throws Exception {
        AlgorithmParameterSpec fpeParameterSpec = new FPEParameterSpec(radix, tweak);
        cipher.init(Cipher.ENCRYPT_MODE, key, fpeParameterSpec);
        return cipher.doFinal(plaintext);
    }

    public byte[] decrypt(Cipher cipher, SecretKey key, byte[] tweak, int radix, byte[] ciphertext) throws Exception {
        AlgorithmParameterSpec fpeParameterSpec = new FPEParameterSpec(radix, tweak);
        cipher.init(Cipher.DECRYPT_MODE, key, fpeParameterSpec);
        return cipher.doFinal(ciphertext);
    }

    private SecretKey generateKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        int keyLength = 256;
        keyGenerator.init(keyLength);
        return keyGenerator.generateKey();
    }

    private byte[] getTweak() {
        int tweakLength = 7;
        byte[] tweak = new byte[tweakLength];
        new SecureRandom().nextBytes(tweak);
        return tweak;
    }

    private int getRadix(String alphabet) {
        AlphabetMapper alphabetMapper = new BasicAlphabetMapper(alphabet);
        int radix = alphabetMapper.getRadix();
        log.info("Radix: {}", radix);
        return radix;
    }
}

我还没有遇到一个如何正确使用它的例子。问题似乎与基数有关。使用以下堆栈跟踪执行上述结果:

代码语言:javascript
运行
AI代码解释
复制
java.lang.IllegalArgumentException: input data outside of radix
    at org.bouncycastle.crypto.fpe.SP80038G.checkData(Unknown Source)
    at org.bouncycastle.crypto.fpe.SP80038G.checkArgs(Unknown Source)
    at org.bouncycastle.crypto.fpe.SP80038G.encryptFF3_1(Unknown Source)
    at org.bouncycastle.crypto.fpe.FPEFF3_1Engine.encryptBlock(Unknown Source)
    at org.bouncycastle.crypto.fpe.FPEEngine.processBlock(Unknown Source)
    at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedFPEBlockCipher.doFinal(Unknown Source)
    at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(Cipher.java:2164)

如果基数设置为例如64或更高,此代码可以工作,但这不再是FPE -密文包含0-9范围外的字符。怎么解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2021-09-29 21:02:14

BouncyCastle可能不支持原始的FF3,但是NIST已经发布了使用基10和256位键进行8字节调整的示例:

样本#11

来自https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/FF3samples.pdf

FF3-美学256

关键是EF 43 59 D8 D5 80 AA 4F 7F 03 6D 6F 04 FC 6A 94 2B 7E 15 16 28

AE D2 A6 AB F7 15 88 09 CF 4F 3C

基= 10

D8 E7 92 0A FA 33 0A73

纯文本为890121234567890000

密码文本是922011205562777495

FF3-1仍然是一个草案,没有公布的测试示例

对于FF3-1,测试类SP80038GTest.java似乎还未完成。它们为FF1在ff1 Samples[]中提供了所有九个NIST测试用例,但对于FF3-1只有一个测试用例,ff3_1 Samples[]中有一个256位键。您可以考虑切换到BouncyCastles的FF1以获得适当的测试覆盖率或使用我的Mysto FF3 & FF3-1实现。

下面是BouncyCastle FF3-1中的一个测试示例,其基为10、7字节和256位键:

代码语言:javascript
运行
AI代码解释
复制
private FFSample(int radix, byte[] key, byte[] plaintext, byte[] ciphertext, byte[] tweak)
    {
        ...
    } 

FFSample.from(10, "1A58964B681384806A5A7639915ED0BE837C9C50C150AFD8F73445C0438CACF3", "4752683571", "2234571788", "CE3EBD69454984")
票数 1
EN

Stack Overflow用户

发布于 2022-07-28 19:19:12

你可以试试我的密码。我可以成功地运行这个测试案例。

代码语言:javascript
运行
AI代码解释
复制
@Test
public void testAesFpe() throws Exception {
    SecretKey key = generateKey();
    byte[] tweak = getTweak();
    AlphabetMapper alphabetMapper = new BasicAlphabetMapper("0123456789");
    int radix = alphabetMapper.getRadix();
    char[] plaintext = "510123456".toCharArray();

    byte[] plain_bytes = alphabetMapper.convertToIndexes(plaintext);

    Cipher cipher = Cipher.getInstance("AES/FF1/NoPadding", new BouncyCastleProvider());
    byte[] cipher_bytes = encrypt(cipher, key, tweak, radix, plain_bytes);

    byte[] decrypted = decrypt(cipher, key, tweak, radix, cipher_bytes);
    char[] cipher_chars = alphabetMapper.convertToChars(cipher_bytes);
    System.out.println(new String(cipher_chars));

    char[] plain_chars = alphabetMapper.convertToChars(decrypted);
    System.out.println(new String(plain_chars));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69226233

复制
相关文章
.NET Core多平台开发体验[2]: Mac OS X
除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL、Ubuntu、Debian、Fedora、CentOS和SUSE等)都提供了很好的支持,我们先来体验一下使用Mac来开发.NET Core应用,在这之前我们照例先得构建我们的开发环境。
蒋金楠
2018/07/31
9150
.NET Core多平台开发体验[2]: Mac OS X
.NET Core多平台开发体验[2]: Mac OS X
除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL、Ubuntu、Debian、Fedora、CentOS和SUSE等)都提供了很好的支持,我们先来体验一下使用Mac来开发.NET Core应用,在这之前我们照例先得构建我们的开发环境。 一、安装开发环境 和Windows一样,如果我们下午在Mac上进行.NET Core应用的开发,我们只需要安装 .NET Core SDK和相应的IDE就可以了。对于前者,我们可以直接从微软官方站点(https://www.m
蒋金楠
2018/03/27
1.5K0
.NET Core多平台开发体验[2]: Mac OS X
PF on Mac OS X
Mac 系统从 10.7 (Lion) 开始就内置了两种防火墙, PF 和 应用防火墙,默认情况下他们都是禁用状态。
上山打老虎了
2022/06/14
9400
mac os x安装教程_OS X EI Capitan
【引用】Mac下面除了用dmg、pkg来安装软件外,比较方便的还有用MacPorts来帮助你安装其他应用程序,跟BSD中的ports道理一样。MacPorts就像apt-get、yum一样,可以快速安装些软件。
全栈程序员站长
2022/09/29
2.1K0
Mac OS X的日常维护
Mac OS X如同其他操作系统一样,经常维护修理,你将不会常常遇到程序意外退出,程序打不开,甚至系统突然瘫痪的状况。下面是一些维护系统的基本方法,供各位参考:
EltonZheng
2021/01/22
9280
Mac OS X中MacPorts安装和使用
大家好,又见面了,我是你们的朋友全栈君。 Mac下面除了用dmg、pkg来安装软件外,比较方便的还有用MacPorts来帮助你安装其他应用程序,跟BSD中的ports道理一样。MacPorts就像apt-get、yum一样,可以快速安装些软件。
全栈程序员站长
2022/11/08
1.4K0
Mac OS X 设置指南
本文介绍了如何通过 Homebrew 安装和配置 macOS 上的开发环境,包括 Node.js、Python、Java、Ruby、Git 等。同时,还介绍了如何配置 VSCode,使用插件和设置,以便更高效地开发 Web 项目。最后,还提供了如何安装和使用 Vim 进行文本编辑的方法。
shaonbean
2018/01/02
1.7K0
Mac OS X 设置指南
Mac OS X下安装和配置Maven
1、下载Maven 打开Maven官网下载页面:http://maven.apache.org/download.cgi 下载:apache-maven-3.5.0-bin.tar.gz 解压下载的安装包到某一目录,比如:/Users/xxx/Documents/maven 2、配置环境变量 打开terminel输入以下命令: vim ~/.bash_profile 打开.bash_profile文件,在次文件中添加设置环境变量的命令 export M2_HOME=/Users/xxx/Documen
代码改变世界-coding
2018/07/03
1.8K0
Build Zeal for Mac OS X
怎么会有如此方便的文档查看工具?顿时觉得被各种加载奇慢的 API 文档坑苦了好多年!于是很开心地下载了我常用的 API 文档,并且找到了它在 Windows 下的替代品 Zeal 推荐给朋友们,感觉世界从此美好了许多。
mzlogin
2020/04/16
2.1K0
Mac OS X 安装 Nginx
nginx -V 查看版本,以及配置文件地址 nginx -v 查看版本 nginx -c filename 指定配置文件 nginx -h 帮助
阳光岛主
2019/02/18
2K0
Mac OS X 安装 Nginx
Build Zeal for Mac OS X
怎么会有如此方便的文档查看工具?顿时觉得被各种加载奇慢的 API 文档坑苦了好多年!于是很开心地下载了我常用的 API 文档,并且找到了它在 Windows 下的替代品 Zeal 推荐给朋友们,感觉世界从此美好了许多。
零式的天空
2022/03/28
4850
Mac OS X下GnuPlot的安装
Gnuplot是一个科学界广泛使用的作图软件,从Unix软件发展而来,是一款免费软件。因为其强大的作图功能,逐渐也有其他行业的人来维护支持这个软件,使其变的越来越流行。
大江小浪
2018/07/25
2.5K0
Mac OS X下GnuPlot的安装
Mac OS X 背后的故事(补充)
补充内容
康怀帅
2018/02/28
8000
Mac OS X 背后的故事(补充)
Mac OS X 背后的故事(下)
Mac OS X 背后的故事(九)半导体的丰收 半导体的丰收(上)   在美国宾夕法尼亚州的东部,有一个风景秀美的城市叫费城。在这个城市诞生了一系列改变世界的奇迹:第一个三权分立的国家——美立坚合众国,就在第五街的路口诞生;举世闻名的费城交响乐团,1900年在市中心的 Academy of Music 奏响了他们的第一个音符。而写这篇文章时,我正坐在三十四街的宾夕法尼亚大学计算机系的一楼实验室,面前摆放着世界上第一台电子计算机——ENIAC。   1946年 2 月 14 日,ENIAC 问世,每秒可运行
康怀帅
2018/02/28
2.3K0
Mac OS X 背后的故事(上)
作者:王越 来源:《程序员》 作者王越,美国宾夕法尼亚大学计算机系研究生,中国著名 TeX 开发者,非著名 OpenFOAM 开发者。 Mac OS X 背后的故事(一)力挽狂澜的Ellen Hancock Mac OS X 背后的故事(二)Linus Torvalds的短视 Mac OS X 背后的故事(三)Mach之父Avie Tevanian Mac OS X 背后的故事(四)政客的跨界 Mac OS X 背后的故事(五)Jean-Marie Hullot的Interface Builder神话 Ma
康怀帅
2018/02/28
3.1K0
在 Mac OS X 上安装和配置 Wine
Windows 上也有很多优秀的工具软件是 Mac 上没有的, 装虚拟机的话太浪费, 而且效率不高, 幸好可以通过 Wine 来运行 Windows 程序, 通过 HomeBrew 使得 Wine 的安装非常容易, 通过 WineTricks 来配置 Wine 也没有多大困难, 下面是我在 Mac 上安装和配置 Wine 的纪录。
beginor
2020/08/10
15.1K1
IntelliJ IDEA两种keymap快捷键方案Mac OS X和Mac OS X 10.5+的区别
IntelliJ IDEA针对Mac OS有两种快捷键方案(keymap),就是Mac OS X和Mac OS X 10.5+,安装后默认的方案是Mac OS X。 那么很容易就会产生一个疑问,这两种有什么区别,哪一种好一点呢? stackoverflow上有大神做出了回答: There is the good explanation in help about the difference between two schemas: 1.the "Mac OS X 10.5+" schema is clo
Albert陈凯
2018/04/04
4.5K0
Mac OS X 安装 JDK备忘
oracle官网从jdk1.7开始才有Mac版的安装包,但有的项目必须使用jdk1.6,所以必须从其他途径安装jdk1.6了。查了下发现,要想安装jdk1.6,可以直接从apple的开发者网站下安装提供的java支持包,具体下载地址 http://connect.apple.com/
Allen Cheng
2018/09/10
1.1K0
Mac OS X 10.11 安装 Pygame
学完python之后就想玩些进阶的, 比如pygame. 但是在Mac OS X下安装pygame遇到了不少坑, 但最终还是顺利解决了, 也再一次深刻体会到google和百度的差距.
Locker
2018/08/01
1.3K0
Mac OS X 10.12.3安装TensorFlow
安装TesorFlow真的是个大坑,整整搞了两天,还没安好GPU版,可能是Mac mini没有独立显卡,但是奇怪的是安装过程中它并没有报错,还安装了NVDIA的驱动,cuda8.0,为了配合cuda8.0我硬生生安了个Xcode7.3,满怀期待地跑smaples,结果一个大大的Error……
刘开心_1266679
2019/02/14
8960

相似问题

Mac os x系统编程和bsd

21

Mac OS X和BSD上的‘'git’和单词边界

30

如何在mac os x (BSD) sed上转义加号?

43

解析链接依赖关系mac os x

13

Mac OS X和Mercurial

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文