Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用字节[]生成密钥会为MAC和Windows生成不同的结果_Java_Windows_Macos_Encryption_Bouncycastle - Fatal编程技术网

Java 使用字节[]生成密钥会为MAC和Windows生成不同的结果

Java 使用字节[]生成密钥会为MAC和Windows生成不同的结果,java,windows,macos,encryption,bouncycastle,Java,Windows,Macos,Encryption,Bouncycastle,我正在尝试使用字节[]生成密钥,即从字符串生成密钥。 我的课程是期末考试,我的方法是静态的 类别: public final class Operation { public static Key getKey(byte[] arr) { Key key = null; KeyGenerator keyGen; Security.addProvider(new BouncyCastleProvider()); try {

我正在尝试使用字节[]生成密钥,即从字符串生成密钥。 我的课程是期末考试,我的方法是静态的

类别:

public final class Operation {

    public static Key getKey(byte[] arr)
    {
        Key key = null;
    KeyGenerator keyGen;
        Security.addProvider(new BouncyCastleProvider());
    try
    {
            keyGen = KeyGenerator.getInstance("AES", "BC");
            if(arr == null)
                keyGen.init(192);
            else
                keyGen.init(new SecureRandom(arr));
            key = keyGen.generateKey();
    }
    catch (NoSuchAlgorithmException e)
    {
            System.err.println(e);  
    } catch (NoSuchProviderException e) {
            System.err.println(e);
        }

        return key;
    }

    public static String getKeyAsString(Key key)
    {
        return  new String(Base64.encode(key.getEncoded()));
    }

    public static Key getKeyFromString(String string)
    {
        return new SecretKeySpec(Base64.decode(string.getBytes()), "AES");
    }

}
主要功能有以下几行:

    Key key1 = Operation.getKey("admin".getBytes());
    Key key2 = Operation.getKey("admin".getBytes());

    System.out.println(new String(Base64.encode(key1.getEncoded())));
    System.out.println(new String(Base64.encode(key2.getEncoded())));
我在windows上获得相同的按键输出,如:

4BjJkLCJ3LyPluKkd2DBgqghhNfSgzKD
4BjJkLCJ3LyPluKkd2DBgqghhNfSgzKD
但Mac OS并非如此

我使用的依赖性是:

<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>

org.bouncycastle
bcprov-jdk16
1.46
现在我要说的是,JDK版本是这里唯一的问题

在windows上,我有
JDK1.7
,而在MAC上我有
JDK1.6
。 这真的是JDK的问题吗?因为我真的被困在这里了


请帮助。

我在Linux中看到不同的值。我认为原因是
SecureRandom
,请查看以下内容:

System.out.println(new SecureRandom("admin".getBytes()).nextLong());
System.out.println(new SecureRandom("admin".getBytes()).nextLong());
输出示例(每次更改):

从javadoc:

许多SecureRandom实现都是伪随机的 数字生成器(PRNG),这意味着它们使用确定性 从真随机种子生成伪随机序列的算法。 其他实现可能会产生真正的随机数,还有一些 可以同时使用这两种技术


是的,我两个都试过了。有编码和无编码。是的,这是因为它调用方法nextLong(),该方法将随机生成nextLong(),对吗??但是为什么我在JDK1.7上得到相同的密钥而不是在1.6上。我不认为操作系统与此有任何关系,因为JVM是独立工作的,对吗?@ADi好吧,两个SecureRandom实例是用相同的种子播种的。如果实现使用PRNG,则nextLong()将是相同的,否则不是。不同的JVM可以有不同的SecureRandom实现。操作系统和版本(以及作者)都可能产生影响。试着在你的环境中运行我的代码。我试过了,它会给我不同的结果。那么,这是否意味着我应该坚持使用JDK1.7的Windows,因为它符合我的目的??)我不认为KeyGenerator应该具有确定性输出。你想做什么?从长远来看,我正在实现我自己的Kerberos,我处于第1阶段,身份验证服务器使用用户的密码创建AES密钥,并将使用它加密会话密钥以将数据包发送回用户。现在,用户必须自己生成相同的密钥。我的代码来了。我必须得到同样的钥匙来完成这件事。
1642139269925848082
2081201540941864354