2010-07-03 43 views
0

我终于 - 经过数天和数天的痛苦 - 发现我需要两种形式的数字签名项目加密。第一意愿将对称(AES)和将加密的许可证数据和第二将是一个不对称的(RSA)的意愿加密对称密钥。有人可以给我指示Android上最好的方法。数字签名的推荐加密组合

For the public/private keys I am using: "RSA/ECB/PKCS1Padding"(我ECB头是坏的,所以我应该用什么?关于PKCS1Padding什么? - shoudl我使用PKCS5Padding)

For the symetric keys I will probably use: "AES/???/?????????"(我应该用什么模式和填充?)

提供者: “BC”

RSA密钥大小:1024(我试过2048,但它并没有出于某种原因)

AES密钥大小:???? (建议)

此外,如果你知道我在哪里可以找到一个很好的指导,什么是实际支持Android会很好。

我绝不是加密专家,所以如果在这里看起来有点不稳定,请告诉我一个更好的选择!

如果你知道一个很好的结合,但如果它支持在Android不知道请告诉我,让我不要最终浪费一大堆时间去寻找它不支持。

回答

2

ECB是不安全的块加密模式,因为它太容易了64,128,或256个块在输入流中重用 - 重复内容的存在将立即在密文中可见。

但RSA不用于加密输入“流” - 它永远只能用于加密会话密钥(如你似乎做)或签署消息的输出消化功能。所以RSA的ECB模式很好。

在RSA中使用PKCS#1填充方案; PKCS#5填充方案用于对称密码。

如果1024是密钥对,你可以用最大的RSA(或产生的设备上?),那么可能128或192位AES是类似的风险。取决于256位AES的速度有多慢,我可能会用它来代替,只是为了提供另外的四年或五年缓冲区来防止AES攻击中的算法改进。

NIST对使用AES指南推荐使用任何的:CBC,CFB,OFB,CTR或模式。

同样的指导方针还提到'add 1和少数0位是完成最终块的填充机制所需的,所以它应该足够安全以便使用。

但对于这一切,我一直在使用GPGME或OpenSSL的或GNUTLS做所有的工作建议。试图使自己的协议可以非常微妙。希望Android上有一些更高级别的工具包可以让签名生成/验证更容易。

NIST的指导方针:http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf

2

说到AES的操作模式,你可以去CBC。如果您的RSA模数为1024位,则不需要大于128位的AES密钥。如果有许可证和软件保护的事,人们会绕过代码,不会打破加密:)

0

如果你正在做的签名比你应该使用Signature类。

+0

我确实需要来获取信息了客户端上的加密文件,所以我没有这个签名类允许这本。 – jax 2010-07-03 16:00:46

+0

你说你在做数字签名。如果是这样,你不加密任何东西。你为什么要加密文件? – 2010-07-03 16:25:30

+0

我被告知它被称为另一个线程上的数字签名,我之前称它为许可证。基本上我在里面存储一些信息,例如设备ID,用户名等。我需要能够检索这些信息,以便在设备上向用户显示,并检查设备ID是否等于其许可设备ID。 – jax 2010-07-04 05:01:42

0

你不应该重新发明车轮。使用BouncyCastle支持的标准机制。

签字,你应该使用PKCS#7签名,这是由这个类处理,

http://bouncycastle.gva.es/www.bouncycastle.org/docs/mdocs1.4/org/bouncycastle/cms/CMSSignedDataGenerator.html

对于加密,您可以使用S/MIME的API,它可以处理对称密钥生成/加密/包围你,

http://www.bouncycastle.org/wiki/display/JA1/CMS+and+SMIME+APIs

+0

这看起来很有趣,但您提供的这些链接并没有那么有用。这两个API对我来说可以做些什么,特别是SMIME API? – jax 2010-07-04 05:12:34

+0

也许这个例子会更好地解释它? http://www.java2s.com/Open-Source/Java-Document/Security/Bouncy-Castle/org/bouncycastle/mail/smime/examples/CreateEncryptedMail.java.htm – 2010-07-04 13:50:12