首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DESKey是否保留无效的奇偶校验位?

DESKey是否保留无效的奇偶校验位?
EN

Stack Overflow用户
提问于 2017-08-15 14:20:14
回答 1查看 405关注 0票数 4

根据DES规范,密钥的每个字节的最后一位用于错误检测(每个字节应具有奇数奇偶校验)。因此,有效密钥长度是56位,而不是64位。

然而,在许多使用情况下,这些奇偶校验位不被校验。有时它们甚至被用于完全不同的目的:例如,Mifare DESFire卡将密钥版本存储在这些位中,即使最初的纠错目的丢失了。

Java Card实现如何处理这些位?让我们来看看这段代码:

代码语言:javascript
复制
DESKey desKey = ... //a single DES key instance
byte[] inputKey = new byte[8];
inputKey[7] = (byte) 0x03; //explicitly invalid parity bit in the last byte
desKey.setKey(inputKey, (short) 0);
byte[] outputKey = new byte[8];
desKey.getKey(outputKey, (short) 0);

是否可以保证inputKeyoutputKey阵列最终将包含相同的数据,即使inputKey中的奇偶校验位无效?我对几种类型的卡进行了几次实验,它们都保留了我放入奇偶校验位中的任何数据,但我在Java card规范中没有发现任何提到这种行为是有保证的。

这段信息对我来说非常重要;否则我将不得不存储与密钥实例分开的“无效奇偶校验位”。

EN

回答 1

Stack Overflow用户

发布于 2017-08-16 04:28:24

如果它不在规范中,那么就不能保证。这真的很简单;对于卡片实现者,没有单独的规范来说明(如果有,可能会在不涉及原始定义的情况下进行更改)。

在攻击方面,对键的操作可能会很棘手。因此,要保持密钥数据的完整性,而不是使用通用CPU遍历密钥位,有很多要说的。此外,当对密钥数据执行诸如使用散列函数计算密钥校验值或使用与MAC (对称签名)的输入相同的密钥等其他操作时,这可能是棘手的。

当然,使用您自己的代码对密钥位执行奇偶校验操作是完全可能的。您可以将结果与测试向量或使用Java SecretKeyFactory生成的键进行比较。但是,由于在密钥计算中不使用奇偶校验位,因此只有当您想要将密钥导出到设备外时才需要这样做。但是,请再次注意,在关键数据上执行额外的操作是危险的,可能会破坏所有类型的安全测试/证明/认证。

请注意,大多数Java Card实现(或者更确切地说,底层芯片的硬件)很可能会对所有持久(EEPROM/闪存)存储器执行校验和。密钥也很可能受到Java Card实现(或底层之一)的保护。因此,关于防止数据意外更改的问题:我不会太担心。为此,您不需要DES奇偶校验位。

好了,我想做点小事,下面是Java Card代码,您可以自己设置奇偶校验(如果您不介意,我将让您来做for循环和内联等工作)。这些计算应该是(接近)恒定时间。

代码语言:javascript
复制
/**
 * This method takes byte value <code>b</code> and then sets or unsets the least significant bit
 * of that value in such a way that the parity of <code>b</code> is odd.
 * So this method returns either <code>b</code> or <code>b ^ 1</code>.
 * 
 * @param b the byte value
 * @return <code>b</code> with DES parity
 */
public static byte makeDESParity(final byte b) {
    byte x = b;
    // trick to calculate odd parity in the lsb of x
    x ^= x >>> 4;
    x ^= x >>> 2;
    x ^= x >>> 1;
    // but we want even parity in the lsb: ~x
    // get the least significant bit: ~x & 1
    // xor that with b: ~x & 1 ^ b
    return (byte) (~x & 1 ^ b);
}

/**
 * This method takes byte value <code>b</code> and returns true if and only if
 * the byte has odd parity.
 * 
 * @param b the byte value
 * @return true if <code>b</code> has DES parity
 */
public static boolean hasDESParity(byte b) {
    // trick to calculate odd parity in the lsb of b
    b ^= b >>> 4;
    b ^= b >>> 2;
    b ^= b >>> 1;
    // check if last bit has indeed been set
    return (b & 1) != 0;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45687445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档