Java 当使用3DES加密字符串时,无此项提供异常

Java 当使用3DES加密字符串时,无此项提供异常,java,android,encryption,3des,Java,Android,Encryption,3des,我是Java新手。我随后介绍了使用3DES算法进行加密和解密 我实施了如下: 创建了一个类并放置了上面链接中提供的3DES代码 在上述链接中调用加密方法,如下所示: String encryptedPassword = Encrypter.encrypt(edtText.getText().toString()); 05-02 15:19:10.804: W/System.err(4445): java.security.NoSuchProviderException: Provider

我是Java新手。我随后介绍了使用3DES算法进行加密和解密

我实施了如下:

  • 创建了一个类并放置了上面链接中提供的3DES代码
  • 在上述链接中调用加密方法,如下所示:

    String encryptedPassword = Encrypter.encrypt(edtText.getText().toString()); 
    
     05-02 15:19:10.804: W/System.err(4445): java.security.NoSuchProviderException: Provider not available: SunJCE
        05-02 15:19:10.820: W/System.err(4445):     at javax.crypto.Cipher.getInstance(Cipher.java:209)
        05-02 15:19:10.820: W/System.err(4445):     at com.example.utilities.Encrypter.encrypt(Encrypter.java:46)
        05-02 15:19:10.820: W/System.err(4445):     at com.example.screens.RegisterScreen.onClick(RegisterScreen.java:152)
        05-02 15:19:10.820: W/System.err(4445):     at android.view.View.performClick(View.java:2485)
        05-02 15:19:10.820: W/System.err(4445):     at android.view.View$PerformClick.run(View.java:9080)
        05-02 15:19:10.828: W/System.err(4445):     at android.os.Handler.handleCallback(Handler.java:587)
        05-02 15:19:10.828: W/System.err(4445):     at android.os.Handler.dispatchMessage(Handler.java:92)
        05-02 15:19:10.828: W/System.err(4445):     at android.os.Looper.loop(Looper.java:130)
        05-02 15:19:10.828: W/System.err(4445):     at android.app.ActivityThread.main(ActivityThread.java:3687)
        05-02 15:19:10.835: W/System.err(4445):     at java.lang.reflect.Method.invokeNative(Native Method)
        05-02 15:19:10.835: W/System.err(4445):     at java.lang.reflect.Method.invoke(Method.java:507)
        05-02 15:19:10.835: W/System.err(4445):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        05-02 15:19:10.835: W/System.err(4445):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
        05-02 15:19:10.835: W/System.err(4445):     at dalvik.system.NativeStart.main(Native Method)
    
  • 我在logcat中得到以下异常:

    String encryptedPassword = Encrypter.encrypt(edtText.getText().toString()); 
    
     05-02 15:19:10.804: W/System.err(4445): java.security.NoSuchProviderException: Provider not available: SunJCE
        05-02 15:19:10.820: W/System.err(4445):     at javax.crypto.Cipher.getInstance(Cipher.java:209)
        05-02 15:19:10.820: W/System.err(4445):     at com.example.utilities.Encrypter.encrypt(Encrypter.java:46)
        05-02 15:19:10.820: W/System.err(4445):     at com.example.screens.RegisterScreen.onClick(RegisterScreen.java:152)
        05-02 15:19:10.820: W/System.err(4445):     at android.view.View.performClick(View.java:2485)
        05-02 15:19:10.820: W/System.err(4445):     at android.view.View$PerformClick.run(View.java:9080)
        05-02 15:19:10.828: W/System.err(4445):     at android.os.Handler.handleCallback(Handler.java:587)
        05-02 15:19:10.828: W/System.err(4445):     at android.os.Handler.dispatchMessage(Handler.java:92)
        05-02 15:19:10.828: W/System.err(4445):     at android.os.Looper.loop(Looper.java:130)
        05-02 15:19:10.828: W/System.err(4445):     at android.app.ActivityThread.main(ActivityThread.java:3687)
        05-02 15:19:10.835: W/System.err(4445):     at java.lang.reflect.Method.invokeNative(Native Method)
        05-02 15:19:10.835: W/System.err(4445):     at java.lang.reflect.Method.invoke(Method.java:507)
        05-02 15:19:10.835: W/System.err(4445):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        05-02 15:19:10.835: W/System.err(4445):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
        05-02 15:19:10.835: W/System.err(4445):     at dalvik.system.NativeStart.main(Native Method)
    

    请帮帮我。如何解决此问题……

    使用此代码加密字符串

        import javax.crypto.Cipher;
        import javax.crypto.spec.IvParameterSpec;
        import javax.crypto.spec.SecretKeySpec;
    
        import android.util.Base64;
        //string encryption
        public class EncryptionHelper {
    
    
    
            // Encrypts string and encode in Base64
            public static String encryptText(String plainText) throws Exception {
                // ---- Use specified 3DES key and IV from other source --------------
                byte[] plaintext = plainText.getBytes();//input
                byte[] tdesKeyData = Constants.getKey().getBytes();// your encryption key
    
                byte[] myIV = Constants.getInitializationVector().getBytes();// initialization vector
    
                Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding");
                SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");
                IvParameterSpec ivspec = new IvParameterSpec(myIV);
    
                c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec);
                byte[] cipherText = c3des.doFinal(plaintext);
                String encryptedString = Base64.encodeToString(cipherText,
                        Base64.DEFAULT);
                // return Base64Coder.encodeString(new String(cipherText));
                return encryptedString;
            }
    
        private class Constants 
    {
    private static final String KEY="QsdPasd45FaSdnLjf";
        private static final String INITIALIZATION_VECTOR="l9yhTaWY";
    public static String getKey() 
        {
            return KEY;
        }
    
    
        public static String getInitializationVector() 
        {
            return INITIALIZATION_VECTOR;
        }
     }   
        }
    
    这就是加密字符串的方法

    String encryptedPassword = EncryptionHelper.encryptText(edtText.getText().toString());
    

    对不起,我太懒了。线路

    Cipher ecipher = Cipher.getInstance("DESede/CBC/PKCS5Padding","SunJCE");
    
    显示您正在指定特定的提供程序。通常,您需要一个很好的理由来这样做,例如,您可能需要使用符合FIPS的提供程序。Android上不存在SunJCE提供程序。只需使用默认提供程序,只需省略该参数即可获得该提供程序。因此,请尝试:

    Cipher ecipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
    
    同样,变革也是如此

    Cipher dcipher = Cipher.getInstance("DESede/CBC/PKCS5Padding","SunJCE");
    


    我正在使用eclipse。。。在常量下显示红线,该导入语句是什么?我有一个名为常量的类文件,其中存储了key和IV。
    Constants.getKey().getBytes()将此替换为您的键我需要提供的
    值是什么?
    常量。getInitializationVector().getBytes()替换为初始化向量在代码中的某个位置指定SunJCE提供程序。即使在Oracle的java运行时中,这也没有任何意义。当然,Android上不存在该提供商。除非有很好的理由,否则请使用默认提供程序。@GregS是否要发布答案?@GregS是否可以发布解决方案?@DuncanJones是否可以帮助我…@user2326860更改代码并删除其中明确说明
    “SunJCE”
    的任何地方。例如,更改
    (“DESede/CBC/pkcs5pdadding”,“SunJCE”)
    (“DESede/CBC/PKCS5P添加”)