首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将BigInteger转换为密钥

将BigInteger转换为密钥
EN

Stack Overflow用户
提问于 2013-07-20 05:12:04
回答 2查看 1.5K关注 0票数 0

如何将大整数转换为java加密库的密钥?我正在尝试使用一个共享diffie密钥,这是我为AES加密的密钥值生成的。

下面是我使用的代码

BigInteger bi;长值= 1000000000; bi =BigInteger.valueOf(值);Key = new key (bi);

然而,这是行不通的。我可以知道如何将BigInteger值转换为键值吗?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-07-20 05:35:25

首先,你不能投它。BigInteger类与Key接口之间没有任何关系。

其次,Key是一个接口,而不是一个类,所以您不能创建它的实例。您需要创建的是实现Key的某个类的实例。而且它很可能需要是一个特定的实现类,而不是匿名类。

最后一点是Java密码API是为了隐藏密钥的表示而设计的。要从字节创建密钥,您需要创建一个KeySpec对象;例如,SecretKeySpec(byte[] key, String algorithm)),然后使用KeyFactory从它“生成”一个键。典型的KeySpec构造函数以byte[]作为参数,因此首先需要从BigInteger实例中获取字节数组。

票数 2
EN

Stack Overflow用户

发布于 2013-07-20 12:16:27

您需要将BigInteger转换为具有特定大小的字节数组,然后使用第一个(最左边)字节来创建密钥。为此,您需要知道DH中使用的素数p的大小,因为值需要左填充以表示键。我建议使用标准化的DH参数(或至少确保素数的大小可除以8)。

请注意,在使用BigInteger.toByteArray()检索的字节数组前面可能有一个零值字节,因为返回的值被编码为有符号的(双补码)大端字节数组。如果结果大于素数(以字节为单位),则需要删除该字节。

代码语言:javascript
复制
public static byte[] encodeSharedSecret(final BigInteger sharedSecret, final int primeSizeBits) {

    // TODO assignment add additional tests on input

    final int sharedSecretSize = (primeSizeBits + Byte.SIZE - 1) / Byte.SIZE;

    final byte[] signedSharedSecretEncoding = sharedSecret.toByteArray();
    final int signedSharedSecretEncodingLength = signedSharedSecretEncoding.length;

    if (signedSharedSecretEncodingLength == sharedSecretSize) {
        return signedSharedSecretEncoding;
    }

    if (signedSharedSecretEncodingLength == sharedSecretSize + 1) {
        final byte[] sharedSecretEncoding = new byte[sharedSecretSize];
        System.arraycopy(signedSharedSecretEncoding, 1, sharedSecretEncoding, 0, sharedSecretSize);
        return sharedSecretEncoding;
    }

    if (signedSharedSecretEncodingLength < sharedSecretSize) {
        final byte[] sharedSecretEncoding = new byte[sharedSecretSize];
        System.arraycopy(signedSharedSecretEncoding, 0,
                sharedSecretEncoding, sharedSecretSize - signedSharedSecretEncodingLength, signedSharedSecretEncodingLength);
        return sharedSecretEncoding;
    }

    throw new IllegalArgumentException("Shared secret is too big");
}

之后,您需要使用某种密钥派生方案来派生密钥字节。您应该使用的标准取决于您正在实现的标准:

RFC 2631中所述

X9.42提供了一种从ZZ生成本质上任意数量的键控材料的算法。我们的算法是由该算法导出的,通过强制指定一些可选字段,而忽略另一些可选字段。 K_m=H( ZZ _x_x_( OtherInfo) ) H是消息摘要函数SHA-1 FIPS-180 ZZ是在2.1.1节中计算出来的共享秘密值。前导零必须是 保存起来,所以ZZ所占的八位数和p一样多。

请注意,我在DH实现中发现了一个关于秘密提取的最多1.49个bug (这是目前的版本)--它确实删除了虚假的引导值为00h的字节,但它忘记了左--将结果填充到素数p。这将导致192次不正确的派生键(!)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17758905

复制
相关文章

相似问题

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