- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在密码学方面遇到了这个问题。问题是我必须在不知道加密 key k 的情况下通过从 Oracle 查询来找到 secret 后缀 s。
我所掌握的有关加密如何完成的信息是,它是在 DES 下使用 ECB 模式、56 位 key 和 64 位输入 block 大小完成的。
所以我的问题是,根据上述所有信息,解密的步骤是什么。根据我的研究,我发现攻击者仅使用给定的密文是没有机会的。所以我想知道在这种情况下是否可以攻击它?
我得到的主要功能如下:
public static void main(String[] args) {
String key = "3%ac^`+="; // a different key
String ciphertext = "a(19q-j*"; // a different suffix
Oracle1 oracle = new Oracle1(key.getBytes(), ciphertext.getBytes());
Attacker1 attacker = new Attacker1(oracle);
byte[] res = attacker.decryptCiphertext();
// should be true
System.out.println(isConsistent(ciphertext, res));
}
我应该在decryptCiphertext()中执行攻击并将结果作为字节数组返回,然后与给定的密文进行比较。如果比较结果为真,则正确。
Oracle.java
public class Oracle1 {
private static Logger logger = LoggerFactory.getLogger(Oracle1.class);
final private byte[] SuffixBytes;
private Cipher cipher;
private static String ALGO = Config.ALGO;
private static int BlockSize = getAlgoBlockSize(ALGO);
public Oracle1() {
this(Config.p1Key, Config.p1Suffix);
}
private void init(byte[] keyBytes) {
Security.addProvider(new BouncyCastleProvider());
SecretKey KEY;
try {
if (isSizeLegal(keyBytes, ALGO)) {
KEY = new SecretKeySpec(keyBytes, ALGO);
} else {
throw new RuntimeException(String.format("illegal ALGO %s with key length %d", ALGO, keyBytes.length));
}
cipher = Cipher.getInstance(String.format("%s/ECB/NoPadding", ALGO));
cipher.init(Cipher.ENCRYPT_MODE, KEY);
} catch (GeneralSecurityException e) {
e.printStackTrace();
System.exit(1);
}
}
public Oracle1(byte[] keyBytes, byte[] suffixBytes) {
SuffixBytes = suffixBytes;
init(keyBytes);
}
public Oracle1(String keyString, String suffixString) {
byte[] keyBytes = keyString.getBytes();
SuffixBytes = suffixString.getBytes();
init(keyBytes);
}
public byte[] compose(String plainText) {
return compose(plainText.getBytes());
}
public byte[] compose(byte[] bytes) {
int byteLength = bytes.length;
if (byteLength > BlockSize) {
logger.info("input length {} > {}", byteLength, BlockSize);
}
byte[] inputBytes = concat(bytes, SuffixBytes);
byte[] finalBytes = paddingBytes(inputBytes, BlockSize);
byte[] cipherBytes = new byte[0];
try {
cipherBytes = cipher.doFinal(finalBytes);
logger.info("input:{}\tcipher:{}", finalBytes, cipherBytes);
} catch (GeneralSecurityException e) {
e.printStackTrace();
System.exit(1);
}
return cipherBytes;
}
}
提前致谢。
最佳答案
我们有一个加密 Oracle,它允许我们发送消息 M
并将返回E(M|S)
(意思是 M
+ S
的加密,其中后缀是)。挑战是确定 S
。我假设给出的 key 和后缀是测试数据,以便在“真正”尝试之前测试代码(因为如果我们知道 key ,我们就可以自己解密结果)。
由于加密使用ECB,因此每个 block 都是独立加密的。我们可以用它来确定 S
.
DES 的 block 大小为 8 字节。如果我们创建一个 7 字节长的输入(例如 7 0x00 字节),那么 Oracle 将追加 S
然后对结果进行加密。这意味着生成的密文的第一个 block 将是加密的
0x00 0x00 0x00 0x00 0x00 0x00 0x00 X
哪里X
是 S
的第一个字节。我们记下这个密文。
如果我们随后发送一系列 8 字节 block ,我们会像这样改变最终字节:
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04
...
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff
并将它们与未知的密文进行比较,我们会找到匹配的密文。这样的区 block 只有 256 个,所以这不会花很长时间。然后我们就知道后缀的第一个字节。
然后我们可以对下一个字节重复此过程,但我们首先发送 6 字节消息而不是 7 字节消息,然后使用现在已知的第一个字节构建(最多)256 条测试消息,因此如果例如,第一个字节是 0x55,它们看起来像
0x00 0x00 0x00 0x00 0x00 0x00 0x55 0x01
0x00 0x00 0x00 0x00 0x00 0x00 0x55 0x02
...
重复此操作,我们可以确定 S
一次一个字节。
看看您给出的代码,我认为这个想法可能是让您实现 Attacker1
类(class),打电话oracle.compose()
从 decryptSuffix()
内多次方法。 main
然后您拥有的方法将用于测试您的代码。然后,您将提交这个类,并将使用“真正的”预言机对其进行测试。
关于java - 在不知道 key 的情况下对 secret 后缀进行密码学解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698202/
我正在对一款流行游戏 (Minecraft) 进行一些修改,我在地形生成中看到了这些线条, double d4 = 1.0D; d4 *= d4; d4 *= d4; d4 = 1.0D - d4;
如何在没有浮点单元的处理器上执行 float 学运算?例如低端 8 位微 Controller 。 最佳答案 看看这篇文章:http://www.edwardrosten.com/code/fp_te
抱歉这个冗长的标题。我的代码针对没有浮点单元的微 Controller (msp430),但这应该适用于任何类似的 MCU。 如果我将一个大的运行时变量与通常被认为是浮点十进制数 (1.8) 相乘,M
我偶尔会在这个方法中遇到 stackoverflow 异常。 double norm_cdf(const double x) { double k = 1.0/(1.0 + 0.2316419
这是一个让我在过去几个小时里完全困惑的问题...... 我的程序中有一个硬编码的方程式: double s2; s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 每
我知道 float 学充其量是丑陋的,但我想知道是否有人可以解释以下怪癖。在我测试的大多数编程语言中,将 0.4 添加到 0.2 会产生轻微错误,而 0.4 + 0.1 + 0.1 则不会。 两者计算
随着数据量持续增长,对合格数据专业人员的需求也会增长。具体而言,对SQL流利的专业人士的需求日益增长,而不仅仅是在初级层面。 因此,Stratascratch的创始人Nathan Rosidi以及我觉
当使用 c++ 或 -O0 编译时,以下 -O1 程序给出了数值不同的结果。 #include #include #include #include int main() { std::a
我正在尝试使用 SVG 在 map 上绘制飞行路径。我在 Leaflet 之上使用 d3,但所使用的框架不会对我的问题产生影响 - 这是三 Angular 关系。 http://fiddle.jshe
使用 IEEE754 float (在 JavaScript 中)时,与数学相关的精度损失风险是什么? 10*.1 即整数乘以有理数。 最佳答案 注意:该问题经过编辑,在发布此答案后很长时间添加了“t
我需要为网站 UI 做一些基本的 float 学运算(金钱的加法和乘法)。我知道 Javascript float 由于存储方式的原因并不准确,但我也知道以某种方式,可以获得我所需的准确度。我知道这一
我有一些像下面这样的宏: #define THING_LENGTH (512) #define MAX_COUNT (4096*8) #define MAX_LENGTH ((int32)((floa
我认为这是一个非常基本的问题 - 我正在执行此功能: private double convertMetersToFeet(double meters) { //function converts
我想在不损失太多精度的情况下替换这些函数中的 float 学,因为我没有 FPU。这可能吗?我认为逗号后的 3 个数字就足够了。 inline float smaller_f(float value,
我需要一个类来表示 double vector (在数学意义上)。 我需要的特殊功能: 任意维度 vector (我通常使用 10 - 100,000 维度) 高性能(用于受 CPU 限制的数字代码)
此社区 Wiki 问题的公认答案:What are best practices that you use when writing Objective-C and Cocoa?说 iPhone 不能
This question already has an answer here: Trouble with float on C [duplicate]
以下代码有问题: private const int movementMultiplier = 2; void Test() { XmlNode xnXCoordinate = xd.Sele
大家早上好 我在 float 学方面遇到了一些问题,完全迷失在“.to_f”、“*100”和“.0”中! 我希望有人能帮助我解决我的具体问题,并准确解释他们的解决方案为何有效,以便我下次理解这一点。
我的嵌入式 C 代码在具有单精度 FPU 的 Cortex M4F 上运行。我担心编译器多久将基于软件的 double 学放在诸如 ** float_var1 = 3.0 * int_var / fl
我是一名优秀的程序员,十分优秀!