相关疑难解决方法(0)

Java 256位AES密码加密

我需要实现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"位:-)

java encryption passwords cryptography aes

381
推荐指数
6
解决办法
52万
查看次数

PBKDF2与Java中的bouncycastle

我正在尝试将密码安全地存储在数据库中,为此我选择存储使用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 bouncycastle jce pbkdf2

38
推荐指数
2
解决办法
2万
查看次数

使用Java中的PBKDF2进行密码验证

我正在用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是否为此提供支持,或者不支持哪种安全替代方案?

谢谢你的时间.

java passwords cryptography aes

18
推荐指数
2
解决办法
2万
查看次数

Bouncy Castle C#中的PBKDF2

我正在弄乱C#Bouncy Castle API以找到如何进行PBKDF2密钥派生.

我现在真的很无能为力.

我尝试通过Pkcs5S2ParametersGenerator.cs和PBKDF2Params.cs文件阅读,但我真的无法弄清楚如何做到这一点.

根据我迄今为止所做的研究,PBKDF2需要一个字符串(或char []),它是密码,盐和迭代计数.

到目前为止,迄今为止最有前途和最明显的是PBKDF2Params和Pkcs5S2ParametersGenerator.

这些似乎都不接受字符串或char [].

有没有人用C#做过这个或者对此有任何线索?或者也许有人在Java中实现了BouncyCastle并可以提供帮助?

Thanx提前很多:)

更新:我在Bouncy Castle找到了如何做到这一点.看下面的答案:)

c# cryptography compact-framework bouncycastle pbkdf2

14
推荐指数
1
解决办法
5195
查看次数

Java相当于C#的Rfc2898DerivedBytes

我想知道是否有人试图做相同的

Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(secret, saltValueBytes);
byte[] secretKey = key.GetBytes(16);
Run Code Online (Sandbox Code Playgroud)

在Java中.其中secret是字符串(密码),而saltValueBytes是字节数组中的salt.

我尝试了一些东西,但似乎无法绕过它.

c# java encryption algorithm rfc2898

6
推荐指数
2
解决办法
5811
查看次数

使用C#CryptoStream的Java equilavent加密和解密字符串

我正在寻找用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#应用程序中的相同加密密钥解密字符串.

谢谢你的帮助.

c# java encryption cryptostream

4
推荐指数
1
解决办法
9694
查看次数