Java,非法访问访问另一个类时出错

时间:2016-03-08 14:26:31

标签: java ssl encryption

我正在尝试编写一个ssl解密程序。我从2010年发现了一些旧代码,并试图让它运行起来。在最终能够编译之后,我现在得到了这个错误:

Exception in thread "main" java.lang.IllegalAccessError: tried to access class sun.security.ssl.CipherSuite from class sun.security.ssl.decrypt at sun.security.ssl.decrypt.main(decrypt.java:36)

这是我调用CipherSuite.valueOf(0x00,0x2f)的行; (删除了一些注释行,这就是为什么它可能是这里的另一个行号)
现在我已经读过,它可能是方法valueOf()是私有的问题。由于我是java的新手,我不知道如何处理它,因为我需要更改的代码是在jar中。 (使用openjdk-1.7)
另一方面,它说here 该方法只是静态的。同样使用.isAvailable()进行检查,如上面链接中推荐的那样(在.valueOf方法中)也无济于事。
有什么建议吗? 这是我到目前为止的代码:

package sun.security.ssl;

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.SecretKey;
import javax.xml.bind.DatatypeConverter;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.security.internal.spec.TlsKeyMaterialParameterSpec;
import sun.security.internal.spec.TlsKeyMaterialSpec;
import sun.security.ssl.CipherSuite.BulkCipher;


public class decrypt {

    public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {

        byte[] clrnd = DatatypeConverter.parseHexBinary("be9b706c800f93526913732a356c7e7fe9383ace52f5ed120d38a81db07e903d");
        byte[] srvrnd = DatatypeConverter.parseHexBinary("56af786428bc3e0c69ef2fdd9f6e3456ceae660a323d6109e9554b4af7fe6652");
        ProtocolVersion pv = ProtocolVersion.valueOf(0x03, 0x03);
        CipherSuite cipher_suite = CipherSuite.valueOf(0x00, 0x2f);
        String KeyAlgo = cipher_suite.cipher.algorithm;
        String Master_Key = "c55ca8dd56fa59b80b8ff01d9a1d4f04251aec41ab6340e8db118b3d4d2ef895cc51592f9bcd5dbde5eda9d5ad386f34";
        byte[] master_secret = DatatypeConverter.parseBase64Binary(Master_Key);
        byte[] client_app_data = DatatypeConverter.parseHexBinary("715e388b6ed9339faa6fc640f329c358");

        SecretKey masterkey = new SecretKeySpec(master_secret, 0, master_secret.length, KeyAlgo);

        //Calculate connection keys
        BulkCipher cipher = cipher_suite.cipher;
        int expandedKeySize = cipher_suite.exportable ? cipher.expandedKeySize : 0;

        KeyGenerator kg = JsseJce.getKeyGenerator("SunTlsKeyMaterial");
        int pv_major = pv.major;
        int pv_minor = pv.minor;
        try {
        kg.init(new TlsKeyMaterialParameterSpec(masterkey, pv_major, pv_minor, clrnd, srvrnd, cipher.algorithm, cipher.keySize, expandedKeySize, cipher.ivSize, cipher_suite.macAlg.size, cipher_suite.prfAlg.getPRFHashAlg(), cipher_suite.    prfAlg.getPRFHashLength(), cipher_suite.prfAlg.getPRFBlockSize()));
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(decrypt.class.getName()).log(Level.SEVERE, null, ex);
        }
        TlsKeyMaterialSpec keySpec = (TlsKeyMaterialSpec)kg.generateKey();

        SecretKey clntWriteKey = keySpec.getClientCipherKey();
        IvParameterSpec clntWriteIV = keySpec.getClientIv();

        SecureRandom clientrandom = new SecureRandom(clrnd);

        CipherBox svbox = cipher_suite.cipher.newCipher(pv, clntWriteKey, clntWriteIV, clientrandom, false);
        try {
            svbox.decrypt(client_app_data, 5, client_app_data.length-5, 0);
        } catch (BadPaddingException ex) {
            Logger.getLogger(decrypt.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println(svbox);
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

猜测因为它使用默认访问修饰符。

Java Access Modifiers

类sun.security.ssl.CipherSuite使用默认访问修饰符。这意味着您只能从同一个包中访问此类,而在项目中并非如此。

CipherSuite class definition