// decode public key
pubk = KeyFactory.getInstance("RSA").generatePublic(
new X509EncodedKeySpec(X)
);
// decode symmetric key
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.UNWRAP_MODE, pubk);
skey = (SecretKey)cipher.unwrap(key1, "AES", Cipher.SECRET_KEY);
pubk
是2048位的RSA键,但有不同的表示形式(Sun或OpenSSL)。key1
是2048位的字节数组。
问题是:我对skey
有不同的结果。在Sun JRE上是128位的AES密钥,在Android上是2048位的数组,包含以下字节:
[1,-1,-1....,-1,0,(此处为实际密钥字节)]
原始包装按以下方式进行:
// generate symmetric key
kgen = KeyGenerator.getInstance("AES");
kgen.init(128, SecureRandom.getInstance("SHA1PRNG"));
skey = kgen.generateKey();
// create Cipher
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
// decode private key
privk = KeyFactory.getInstance("RSA").generatePrivate(
new PKCS8EncodedKeySpec(X)
);
// wrap symmetric key
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, privk);
skey_buffer = cipher.wrap(skey);
UPD:我没有注意,没有注意到这样一个事实:unwrappedskey
不是256位,而是2048位。更新的问题。
二进制数据的大小--AES密钥--是在解密过程中确定的。
加密明文数据的大小由Sun提供程序中的PKCS#1 v1.5解填充机制确定(在解密的第一步,即用私钥进行模幂运算后得到)。换句话说,Sun提供程序默认为“rsa/ecb/pkcs1padding”
。
然而,在Android提供程序中,并不执行PKCS#1 v1.5的解填充操作,相反,它似乎默认为“rsa/ecb/nopadding”
。这就是为什么在结果中看到所有的-1值;这是填充物的一部分。这也意味着使用签名生成的填充机制而不是用于加密的填充机制。这是因为您使用私钥而不是公钥来执行加密。
我被要求为安全类实现AES算法。在实现过程中,我找不到答案,我如何从用户那里接受像密码这样的任意长度的密钥,并将其转换为128、192或256位密钥。我该怎么办?
我正在学习ssl通信的基础知识,尤其是AES加密。我读了OpenSSL代码,看到了一个名为< code>userkey的指针。 在文件"aes_core. c"中 > 从何而来?它是如何生成的? 我想知道不同版本AES的的实际大小。 256 位版本为 256 / 8 = 32,192 为 24,128 为 16?我有点迷茫。 如果长度是可变的,那么我应该如何为那些符合长度要求的输入创建一个安全的输
考虑以下java代码: 此代码输出“”。所以是64字节,而SHA-256是32字节哈希。 我知道我指定了512位(64字节)作为密钥长度 然而,我希望生成的密钥(PBKDF2)将由SHA-256进行散列,这样无论我使用的密钥大小如何,输出都应始终为32字节。 我错过了什么(或者为什么我的期望是错误的)?
问题内容: 我无法在上创建索引。 MySQL: 问题答案:
问题内容: 我有一个主键为varchar(255)的表。在某些情况下,255个字符不够用。我尝试将字段更改为文本,但是出现以下错误: 我怎样才能解决这个问题? 编辑:我还应该指出,该表具有包含多个列的复合主键。 问题答案: 发生错误是因为MySQL只能索引BLOB或列的前N个字符。所以错误主要发生时,有一个领域/列类型或BLOB或那些属于或类型,如,,,,,和您尝试使一个主键或索引。无论长度是完整
问题内容: 我正在使用3DESC解密数据,但出现以下异常 我的代码: 打印上面使用的所有字节数组 问题答案: DES- EDE密码可与3个不同的子密钥一起使用,因此密钥大小应为24字节(3乘8字节)。如果您只想使用2个键(即在此模式下,第一个键==最后一个键),则只需复制键数组的前8个字节。