Java 当使用3DES加密字符串时,无此项提供异常
我是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
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)
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添加”)代码>。