我需要实现256位AES加密,但我在网上找到的所有示例都使用"KeyGenerator"生成256位密钥,但我想使用自己的密码.如何创建自己的密钥?我已经尝试将其填充为256位,但后来我得到一个错误,说密钥太长了.我确实安装了无限管辖区补丁,所以那不是问题:)
IE浏览器.KeyGenerator看起来像这样......
// Get the KeyGenerator
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // 192 and 256 bits may not be available
// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
Run Code Online (Sandbox Code Playgroud)
编辑
我实际上是将密码填充到256个字节,而不是位,这太长了.以下是我现在使用的一些代码,我对此有更多的经验.
byte[] key = null; // TODO
byte[] input = null; // TODO
byte[] output = null;
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
output = cipher.doFinal(input)
Run Code Online (Sandbox Code Playgroud)
您需要自己做的"TODO"位:-)
我正在尝试将密码安全地存储在数据库中,为此我选择存储使用PBKDF2函数生成的哈希.我想使用充气城堡库来做这个,但我不知道为什么我不能通过使用JCE接口让它工作...问题是在3种不同模式下生成散列:
1.使用PBKDF2WithHmacSHA1密钥工厂由sun提供
2.直接使用充气城堡api
3.通过JCE使用充气城堡
产生2个不同的值:一个与前两个共同,一个与第三个相同.
这是我的代码:
//Mode 1
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keyspec = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key key = factory.generateSecret(keyspec);
System.out.println(key.getClass().getName());
System.out.println(Arrays.toString(key.getEncoded()));
//Mode 2
PBEParametersGenerator generator = new PKCS5S2ParametersGenerator();
generator.init(PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(("password").toCharArray()), salt, 1000);
KeyParameter params = (KeyParameter)generator.generateDerivedParameters(128);
System.out.println(Arrays.toString(params.getKey()));
//Mode 3
SecretKeyFactory factorybc = SecretKeyFactory.getInstance("PBEWITHHMACSHA1", "BC");
KeySpec keyspecbc = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key keybc = factorybc.generateSecret(keyspecbc);
System.out.println(keybc.getClass().getName());
System.out.println(Arrays.toString(keybc.getEncoded()));
System.out.println(keybc.getAlgorithm());
Run Code Online (Sandbox Code Playgroud)
我知道PBKDF2是使用HMAC SHA1实现的,这就是为什么我在最后一个方法中选择了作为算法的"PBEWITHHMACSHA1",我从充气城堡java docs中获取.
输出如下:
com.sun.crypto.provider.SunJCE_ae
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, …Run Code Online (Sandbox Code Playgroud) 我正在用Java做基于密码的文件加密; 我使用AES作为底层加密算法,PBKDF2WithHmacSHA1并使用以下代码从盐和密码组合中获取密钥(我从本网站上的另一张慷慨的海报中获得).
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec ks = new PBEKeySpec(password,salt,1024,128);
SecretKey s = f.generateSecret(ks);
Key k = new SecretKeySpec(s.getEncoded(),"AES");
Run Code Online (Sandbox Code Playgroud)
我共享盐,用户在每端输入密码,加密和解密工作正常:-)我的问题是,我希望能够验证用户输入的密码是否正确才能开始(可能很长)解密过程.我知道PBKD规范包含一个可选的2字节验证值,但我不知道如何使用上述方法生成此值.Java是否为此提供支持,或者不支持哪种安全替代方案?
谢谢你的时间.
我正在弄乱C#Bouncy Castle API以找到如何进行PBKDF2密钥派生.
我现在真的很无能为力.
我尝试通过Pkcs5S2ParametersGenerator.cs和PBKDF2Params.cs文件阅读,但我真的无法弄清楚如何做到这一点.
根据我迄今为止所做的研究,PBKDF2需要一个字符串(或char []),它是密码,盐和迭代计数.
到目前为止,迄今为止最有前途和最明显的是PBKDF2Params和Pkcs5S2ParametersGenerator.
这些似乎都不接受字符串或char [].
有没有人用C#做过这个或者对此有任何线索?或者也许有人在Java中实现了BouncyCastle并可以提供帮助?
Thanx提前很多:)
更新:我在Bouncy Castle找到了如何做到这一点.看下面的答案:)
我想知道是否有人试图做相同的
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(secret, saltValueBytes);
byte[] secretKey = key.GetBytes(16);
Run Code Online (Sandbox Code Playgroud)
在Java中.其中secret是字符串(密码),而saltValueBytes是字节数组中的salt.
我尝试了一些东西,但似乎无法绕过它.
我正在寻找用Java开发移动平台操作系统的应用程序.
我已经在C#WPF中为Windows环境开发了一个应用程序.我使用cryptostream以使用以下代码加密和解密字符串.下面显示的代码只是加密
public string encrypt(string encryptionString)
{
byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString);
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
MemoryStream ms = new MemoryStream();
byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj");
byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo");
CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);
cs.Write(clearTextBytes, 0, clearTextBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
加密的字符串存储在在线数据库中.我需要做的是让java应用程序能够从数据库中读取字符串并使用C#应用程序中的相同加密密钥解密字符串.
谢谢你的帮助.
java ×5
c# ×3
cryptography ×3
encryption ×3
aes ×2
bouncycastle ×2
passwords ×2
pbkdf2 ×2
algorithm ×1
cryptostream ×1
jce ×1
rfc2898 ×1