A. java 怎麼實現PHP的base64加密,兩種語言的base64加密後的數據不一致
在開發的時候遇到個現象。對方用PHP base64_encode() 對字元串進行加米。但我這邊是用Java解馬。導致出現問題。問題如下:
[java] view plain
package com.tudou.test;
import java.io.IOException;
/**
* <p>java base64編碼和解碼的演示類
* 註:base64編碼後通過url傳遞時,獲得時"="會給替換掉,* 處理方式:在編碼前將"=","/","+" 替換成別的字元,在解碼之前替換回來* </p>
* @author tw 2010-03-01
*
*/
public class TestBase64Net {
/**
* 編馬
* @param filecontent
* @return String
*/
public static String encode(byte[] bstr){return new sun.misc.BASE64Encoder().encode(bstr);}
/**
* 解碼
* @param filecontent
* @return string
*/
public static byte[] decode(String str){
byte[] bt = null;
try {
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();bt = decoder.decodeBuffer( str );
} catch (IOException e) {
e.printStackTrace();
}
return bt;
}
/**
* @param args
*/
public static void main(String[] args) {
TestBase64Net te = new TestBase64Net();
//PHP 用base64 將union_id=102155_100001_01_01 加米後的字元串為: //java 用sun.misc.BASE64Encoder().encode()進行解馬,結果為:union_id=102155_100001_01_01亂碼0System.out.println(new String(te.decode("")));//java 用sun.misc.BASE64Decoder 將union_id=102155_100001_01_01進行加米,結果為:==System.out.println(new String(te.encode("union_id=102155_100001_01_01".getBytes())));}
}
經過對比不難發現用php的base64_encode() 方法進行加米,JAVA 不能用sun.misc.BASE64Encoder().encode() 進行解米。那該怎麼辦?!
可以用apache的commons包 commons-codec-1.7.jar 中的org.apache.commons.codec.binary.Base64 進行解米。
[java] view plain
import org.apache.commons.codec.binary.Base64;public class TestBase64 {
public static void main(String[] args) {
System.out.println(new String(Base64.decodeBase64("".getBytes())));}
}
?
B. 在Java中如何進行BASE64編碼和解碼
如果是單純只想用復的話,導這制個包進你的項目snakeyaml-1.17.jar,
裡面有個類可以直接用
org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder
例如:
String needToEncode = "你想編碼的字元串";
String encoded = Base64Coder.encodeString(needToEncode);
// 控制台輸出:
String decoded = Base64Coder.decodeString(encoded );
// 控制台輸出:你想編碼的字元串
Base64Coder這個類還提供了別的方法,可以自己看一下。
僅供參考。
C. 將base64位轉換成png圖片的java代碼
//base64字元串轉化成圖片
public static boolean GenerateImage(String imgStr)
{ //對位元組數組字元串進行Base64解碼並生成圖片
if (imgStr == null) //圖像數據為空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try
{
//Base64解碼
byte[] b = decoder.decodeBuffer(imgStr);
for(int i=0;i<b.length;++i)
{
if(b[i]<0)
{//調整異常數據
b[i]+=256;
}
}
//生成jpeg圖片
String imgFilePath = "d://222.jpg";//新生成的圖片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
return true;
}
catch (Exception e)
{
return false;
}
}
希望可以幫到你。
D. java base64
java base64是什麼,讓我們一起了解一下?
Base64是一種編碼方法,要求把每三個8Bit的位元組轉換為四個6Bit的位元組,轉換之後的這四個位元組中每6個晌慧穗有效bit為有效數據,空餘的那兩個bit用0補上成為一個位元組。
為什麼要使用Base64?
Base 64主要用途不是加密,而是把一些二進制數轉成普通字元,方便在網路上傳輸。 由於一些二進制字元在傳輸協議中屬於控制字元,不能直接傳送,所以需要轉換一下才可以。由於某些系統中只能使用ASCII字元,Base64就是用來將非ASCII字元的數據轉換成ASCII字元的一種方法,Base64特別適合在http,mime協議下快速傳輸數據。
比如網路中圖片的傳輸Base64,並非安全領域下的加密解密演算法。雖然經常遇到所謂的base64的加密解密。但base64隻能算是一個編碼演算法,對數據內容進行編碼來適合傳輸。雖然base64編碼過後原文也變成不能看到的字元格式,但是方式初級又簡單。
那在Java中想要實現Base64的加解密,有哪些方式?
主要有以下四種(推薦度由低到高):
1、JDK中的宴卜sun.misc套碧桐件。
2、第三方擴展包 bouncy castle。
3、第三方擴展包 commons codec。
4、JDK8及更高版本中的 java.util.Base64。
實戰操作,JDK實現代碼如下: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * BASE64加密解密 */ public class BASE64 { /** * BASE64解密 * @param key * @return * @throws Exception */ public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64加密 * @param key * @return * @throws Exception */ public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } public static void main(String[] args) throws Exception { String data = BASE64.encryptBASE64("http://aub.iteye.com/".getBytes()); System.out.println("加密前:" + data); byte[] byteArray = BASE64.decryptBASE64(data); System.out.println("解密後:" + new String(byteArray)); } }
E. java base64解密亂碼問題 代碼如下:
private String getPictureString() {
String upload = "";
try {
FileInputStream in = new FileInputStream(fileName);
byte[] ba = new byte[in.available()];
in.read(ba);
in.close();
upload = new String(android.util.Base64.encode(ba,
android.util.Base64.DEFAULT));
} catch (FileNotFoundException e) {
LogUtil.e(e.getMessage(), e);
} catch (IOException e) {
LogUtil.e(e.getMessage(), e);
}
return upload;
}
這個是加密
解密就是
encode換成decode
upload=newString(android.util.Base64.decode(ba,
android.util.Base64.DEFAULT));
F. 求java加密源代碼(MD5,base64)
import java.security.*;
import javax.crypto.*;
/**
* 本例解釋如何利用DES私鑰加密演算法加解密
*
* @author Devon
* @version 1.0 04/03/10
*/
public class SingleKeyExample {
public static void main(String[] args) {
try {
String algorithm = "DES"; //定義加密演算法,可用 DES,DESede,Blowfish
String message = "Hello World. 這是待加密的信息";
// 生成個DES密鑰
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
keyGenerator.init(56); //選擇DES演算法,密鑰長度必須為56位
Key key = keyGenerator.generateKey(); //生成密鑰
// 生成Cipher對象
Cipher cipher = Cipher.getInstance("DES");
//用密鑰加密明文(message),生成密文(cipherText)
cipher.init(Cipher.ENCRYPT_MODE, key); //操作模式為加密(Cipher.ENCRYPT_MODE),key為密鑰
byte[] cipherText = cipher.doFinal(message.getBytes()); //得到加密後的位元組數組
System.out.println("加密後的信息: " + new String(cipherText));
//用密鑰加密明文(plainText),生成密文(cipherByte)
cipher.init(Cipher.DECRYPT_MODE, key); //操作模式為解密,key為密鑰
byte[] sourceText = cipher.doFinal(cipherText); //獲得解密後位元組數組
System.out.println("解密後的信息: " + new String(sourceText));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* @author Devon
*/
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
public class PairKeyExample {
public static void main(String argv[]) {
try {
String algorithm = "RSA"; //定義加密演算法,可用 DES,DESede,Blowfish
String message = "張三,你好,我是李四";
//產生張三的密鑰對(keyPairZhang)
KeyPairGenerator keyGeneratorZhang =
KeyPairGenerator.getInstance(algorithm); //指定採用的演算法
keyGeneratorZhang.initialize(1024); //指定密鑰長度為1024位
KeyPair keyPairZhang = keyGeneratorZhang.generateKeyPair(); //產生密鑰對
System.out.println("生成張三的公鑰對");
// 張三生成公鑰(publicKeyZhang)並發送給李四,這里發送的是公鑰的數組位元組
byte[] publicKeyZhangEncode = keyPairZhang.getPublic().getEncoded();
//通過網路或磁碟等方式,把公鑰編碼傳送給李四
//李四接收到張三編碼後的公鑰,將其解碼
KeyFactory keyFacoryLi = KeyFactory.getInstance(algorithm); //得到KeyFactory對象
X509EncodedKeySpec x509KeySpec =
new X509EncodedKeySpec(publicKeyZhangEncode); //公鑰採用X.509編碼
PublicKey publicKeyZhang = keyFacoryLi.generatePublic(x509KeySpec); //將公鑰的KeySpec對象轉換為公鑰
System.out.println("李四成功解碼,得到張三的公鑰");
//李四用張三的公鑰加密信息,並發送給李四
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); //得到Cipher對象
cipher.init(Cipher.ENCRYPT_MODE, publicKeyZhang); //用張三的公鑰初始化Cipher對象
byte[] cipherMessage = cipher.doFinal(message.getBytes()); //得到加密信息
System.out.println("加密後信息:" + new String(cipherMessage));
System.out.println("加密完成,發送給李四...");
//張三用自己的私鑰解密從李四處收到的信息
cipher.init(Cipher.DECRYPT_MODE, keyPairZhang.getPrivate()); //張三用其私鑰初始化Cipher對象
byte[] originalMessage = cipher.doFinal(cipherMessage); //得到解密後信息
System.out.println("張三收到信息,解密後為:" + new String(originalMessage));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
G. 關於java中BASE64解碼演算法
讓我們再來看一個實際的例子,加深印象!
轉換前 10101101 10111010 01110110
轉換後 00101011 00011011 00101001 00110110
十進制 43 27 41 54
對應碼表中的版值 r b p 2
將第一個字元右移權2位得00101011, 得第一個目標字元00101011
將第一個字元左移4位得11010000,第二個字元右移4位的00001011相加得第二個目標字元11011011
將第二個字元左移2位得11101000,第三個字元右移6位的00000001相加的第三個目標字元11101001
第四個目標字元就是01110110
然後讓各個目標字元與0x3F進行and位操作,讓最高的兩位為零。
H. JAVA怎麼樣實現Base64加密解密
package test;
import java.io.IOException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Test {
public static void main(String[] args) {
str = "java12345";
String ret = null;
ret = new BASE64Encoder().encode(str.getBytes());
System.out.println("加密前:"+str+" 加密後:"+ret);
str = "amF2YTEyMzQ1";
try {
ret = new String(new BASE64Decoder().decodeBuffer(str));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("解密前:"+str+" 解密後:"+ret);
}
}
I. Base64演算法原理及實現
Base64演算法最開猛歷始是被用於解決電子郵件數據傳輸問題。在早期,由於歷史原因問題,電子郵件只允許使用ASCII字元,如果在郵件中出現了非ASCII字元,在通過某些網關進行數據轉發的時候,網關會對這些非ASCII字元做出調整,例如,把ASCII碼8位二進制碼的最高位置為0。此時接收方在收到郵件時就會出現亂碼。基於這個原因,產生了Base64演算法。
Base64編碼的思路說白了,就是把傳輸數據的每個位元組映射成ASCII碼表中的某些字元,這樣在傳輸的過程中,就不會出現亂碼的問題了。Base64演算法定義了一個映射表,如下所示。
由上表可以看出,之所以稱為Base64編碼,實際上是把原數據映射成了ASCII碼表中的64個字元。但是,64個字元最多能映射的位數是6bit。但是每個數據是8bit的,那怎麼轉換呢?Base64編碼的基本思想: 將原數據每3個位元組(24bit)分為一組,然後將這24bit數據按照每6bit一組,重新劃分為4組,分組完成之後,再將每每6bit數據為單元進行映射。
Base64編碼的基本流程如下:
例如,將字元串前世"ABC"進行Base64編碼流程如下。
所以,字元串"ABC"經過Base64編碼後的數據是"QUJD"。
從Base64編碼的原理可以看到,Base64實際上就是把原來數據中的每3個位元組一組進行Base64編碼轉換,編碼之後變成4個Base64字元。但是如果原文數據長度不是3的整數倍的時候該怎麼辦呢?Base64演算法規定,如果待加密數據不是3的整數倍,就在原文數據後面補0,直到長度湊夠3的整數倍為止,然後再進行Base64編碼轉換。待編碼轉換完成之後,在結果末尾補充相同個數的"="。
例如,將字元串"ABCD"進行Base64編碼流程如下。
所以,字元串"ABC"經過Base64編碼後的字元串是"QUJDRA=="。
其實這里有個規律,當原文的數據長度除以3餘數為0時,編碼之後後面沒有"=";當余數為1時,後面有兩個"=",當余數是2時,後面有一個"=","="的個數也就是補充的位元組數。
通過Base64的原理可以看到,Base64編碼實際上是把原數據的3個位元組映射成了4個位元組,所以相比於原數據長度,編碼後的長度會增加1/3。這也會降低傳輸效率。
Get方式和Post方式是Http請求常用的兩種方式,某些情況下會要求使用Get方式來傳遞二進制數據。這時,可以先通過Base64編碼來將二進制數據轉換成字元串數據。由於符號"+"和符號"/"是不允許出現在Url中的,所以,產生了Url安全的Base64演算法,所謂的Url安全的Base64演算法,其實主要包含兩個方面。
目前,在Java中,我們可以通過以下方式來是使用Base64演算法。
在java8之前,JDK官方庫中都沒有內置Base64演算法,其實Base64實現很簡單,這個不知道為什麼。但是Java8內置了Base64編碼器和解碼器。
在Java8中,Base64工具類提供了三種BASE64編解碼器:
1.基本Base64編碼
也就是完全按照標准Base64的映射規則來編解碼,不添加任何行標。
2.Url Base64編碼
JDK標准類庫中的Url Base64編碼是用"-"和"_"取代了"+"和"/"
3.MIME Base64編碼
Java類庫中還提供了一種格式更友好的Base64編碼,這種編碼輸出每行不超過76字元,並且使用'
'並跟隨'
'作為分割。
4.去除填充符的Base64
在Java標准類庫中,還提供了一種方式來去除編碼末尾的"=",就是在構建Encoder 對象後調用withoutPadding()方法,例如:
Commons Codec是Apache為Java開發者提供的一個開源軟體類庫,該類庫中主要是一些常用的編碼工具類包,例如DES、SHA1、MD5、Base64,URL等。在使用該類庫之前需要首先在Eclipse中添加依賴。Commons Codec提供了以下Base64編碼方式。
1.基本Base64編碼
Commons Codec和Java標准類庫提枝悔搜供給的Base64編碼方式是一樣的。
2.Url Base64編碼
Url Base64編碼和Java類庫也是一樣的,把"+"和"/"替換成了"-"和"_",有一個不同的地方是Commons Codec中的Url Base64默認去掉了後面的"=",相當於Java類庫中調用了withouPadding方法,例如:
3.類MIME格式輸出
Commons Codec中也提供了類似於Java類庫中的MIME的格式化輸出,在Commons Codec中有一個方法:
這里的isChunked置為true,就表示是按照MIME格式輸出編碼結果。
h
J. 從文件中讀取數據並編碼成base64 java
代碼如下:
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.util.Arrays;
importjava.util.Base64;
importjava.util.Base64.Encoder;
publicclassApp{
publicstaticvoidmain(String[]args)throwsIOException{
Encoderencoder=Base64.getEncoder();
byte[]buffer=newbyte[1024];
intlen=0;
StringBuilderbuilder=newStringBuilder();
try(FileInputStreaminputStream=newFileInputStream("d:\temp\abc.txt")){
while((len=inputStream.read(buffer))!=-1){
byte[]src=Arrays.OfRange(buffer,0,len);
builder.append(encoder.encodeToString(src));
}
}
System.out.println(builder.toString());
}
}