任何密码学文本都提到,在对对称算法的蛮力攻击中,在尝试一半后有 50% 的机会找到密钥。
例如,具有 56 位密钥的 DES 在前 2 55 次尝试后将有 50% 的机会找到密钥。
为什么在对任何对称加密算法的蛮力攻击中,尝试一半后有 50% 的机会找到密钥?它的数学证明是什么?
我开始学习使用 CryptoKit 进行解密/加密。一切正常,但我无法共享生成的 SymmetricKey。
例子:
let key = SymmetricKey(size: .bits256)
Run Code Online (Sandbox Code Playgroud)
好吧,我生成了一个对称密钥。现在我想分享密钥,但我该怎么做呢?在调试器中,变量键是空的?我检查了加密和解密 - 运行良好 - 输出显示加密和解密的数据。如何保存我的可变键以进行分发?
我找到了一个解决方案:
let savedKey = key.withUnsafeBytes {Data(Array($0)).base64EncodedString()}
Run Code Online (Sandbox Code Playgroud)
这很好用,但是如何将变量savedKey (String)保存回变量键(SymmetricKey)?
我有一段代码用AES密钥包装对称密钥(AES):
码:
SecretKey swkKeySpec = new SecretKeySpec(swkKey, 0, swkKey.length, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
final int ivLength = 12;
final IvParameterSpec iv = createIV(ivLength);///Creates a new array.
cipher.init(Cipher.WRAP_MODE, swkKeySpec, iv);
SecretKey sKeySpec = new SecretKeySpec(key, 0, key.length, "AES");
byte[] wrappedAppKey = cipher.wrap(sKeySpec);`
Run Code Online (Sandbox Code Playgroud)
如果key是256位,而swkkey是256位,则wrappedAppKey的长度是多少。包装的密钥可以超过32个字节吗?请注意,在这种情况下,我将收到以下日志:
key length: 32(key to be wrapped)
swkKey length: 32(key used to wrap)
wrappedAppKey size: 48(final wrapped key output).
Run Code Online (Sandbox Code Playgroud) 我需要加密数据并将其存储在一个文件中,然后才能将其解密.为此,我使用RijndaelManaged类.现在我不想在代码中保持密钥的硬编码.经过一些谷歌搜索后我发现了这种方法 -
这里生成了密钥,但是密码,盐和IV等所有其他值都是硬编码的.我没有让用户输入密码的选项,因此我还必须对这些值进行硬编码.那真的很安全吗?一些黑客能不能使用工具来找到这些硬编码值并弄清楚关键?
我发现Python包加密了一些数据,并在python Cryptography中看到了这一点:
可以使用密码与Fernet(对称密钥).为此,您需要通过密钥派生函数(如PBKDF2HMAC,bcrypt或scrypt)运行密码.
但是,事实证明密码的工作方式与密钥相同(使用密码/密钥进行加密/解密).那么为什么还要使用密码而不是密钥呢?
我的意思是为什么不只是使用密钥本身:
from cryptography.fernet import Fernet
key = Fernet.generate_key()
token = Fernet(key).encrypt(b"my deep dark secret")
Fernet(key).decrypt(token)
Run Code Online (Sandbox Code Playgroud)