我正在尝试对通过不安全通道发送或存储在不安全位置的文件实施安全加密。我使用bouncy castle框架,我的代码是用scala编写的。我决定使用aes - 256(更具体地说 - 具有256位块大小的Rinjael,here is why)。似乎我可以使用任何(128 | 160 | 192 | 256)块长度的Rinjael。
我无法正确理解整个过程概述。 Here是一个很好的答案,in this question有一些特定于充气城堡的有用代码。但是两个都没有给我留下一些问题(下面的问题)。
这就是我理解工作流程的方式:
为了创建一个块密码实例,我必须得到一个填充块密码的实例,并带有一些输出反馈:
// create an instance of the engine
val engine = new RijndaelEngine(bitLength)
// wrap engine with some feedback-blocking cipher mode engine
val ofb = new OFBBlockCipher(engine , bitLength)
// wrap this with some padded-blocking cipher mode
val cipher = new PaddedBufferedBlockCipher(ofb, new PKCS7Padding())
现在我必须在密码引擎上运行init()
2.1。首先生成一个密钥,为此,建议here建议的最佳解决方案是使用Scrypt
从密码中导出秘密,而不是使用PBKDF2-HMAC-xxx
。在russian wikipedia article on Scrypt中,据说Scrypt的推荐参数如下:N = 16384, r = 8, p = 1
所以我用这个代码来生成密码:
SCrypt.generate(password.getBytes(encoding), salt, 16384, 8, 1, bitLength / 8)
2.2。这导致我需要盐。盐should be an array of random bytes。大多数answers此处use 8个字节。所以我做了
// helper method to get a bunch of random bytes
def getRandomBytes(size: Int) = {
val bytes = Array.ofDim[Byte](size)
val rnd = new SecureRandom()
rnd.nextBytes(bytes)
bytes
}
// generate salt
val salt = getRandomBytes(8)
2.3。为了使密码初始化,我们需要一个初始化向量(请看下面我的问题(2))。
val iv = getRandomBytes(bitLength / 8)
2.4。现在我们准备初始化密码了。
cipher.init(mode, params(password, salt, iv, bitLength))
8
字节,而不是更多?cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
还是像我一样随意?提前致谢!
答案 0 :(得分:2)
答案 1 :(得分:0)
安全吗?当然,他们仍然需要猜测密码。它安全吗?不,因为您向攻击者提供了简化解密过程所需的信息。如果你可以通过一个未加密的通道获得盐/密码的唯一方法是通过一个未加密的通道,那么我想的东西总比没有好,但为什么你不能用PKI / SSL交换这些信息呢?