openssl java aes_請問如何使用AES對使用OpenSSL命令加密的Java文件進行解密?

以下是OpenSSLPBEInputStream和OpenSSLPBEOutputStream它可以用于以與OpenSSL兼容的方式加密/解密任意字節流。

示例用法://?The?original?clear?text?bytes

byte[]?originalBytes?=?...

//?Encrypt?these?bytes

char[]?pwd?=?"thePassword".toCharArray();

ByteArrayOutputStream?byteOS?=?new?ByteArrayOutputStream();

OpenSSLPBEOutputStream?encOS?=?new?OpenSSLPBEOutputStream(byteOS,?ALGORITHM,?1,?pwd);

encOS.write(originalBytes);

encOS.flush();

byte[]?encryptedBytes?=?byteOS.toByteArray();

//?Decrypt?the?bytes

ByteArrayInputStream?byteIS?=?new?ByteArrayInputStream(encryptedBytes);

OpenSSLPBEInputStream?encIS?=?new?OpenSSLPBEInputStream(byteIS,?ALGORITHM,?1,?pwd);

其中算法(只使用JDK類)可以是:“PBEWithMD5AndDES”、“PBEWithMD5AndTripleDES”、“PBEWithSHA1AndDESede”、“PBEWithSHA1AndRC2_40”。

要處理原始海報的password.txt-out password.txt.enc中的“OpenSSL AES-256-CBC-a-鹽類”,在類路徑中添加彈跳城堡,并使用算法=“PBEWITMD5AND256BITAES-CBC-OpenSSL”。/*?Add?BC?provider,?and?fail?fast?if?BC?provider?is?not?in?classpath?for?some?reason?*/

Security.addProvider(new?BouncyCastleProvider());

依賴性:

org.bouncycastle

bcprov-jdk16

1.44

輸入流:import?javax.crypto.BadPaddingException;

import?javax.crypto.Cipher;

import?javax.crypto.IllegalBlockSizeException;

import?javax.crypto.NoSuchPaddingException;

import?java.io.IOException;

import?java.io.InputStream;

import?java.security.InvalidAlgorithmParameterException;

import?java.security.InvalidKeyException;

import?java.security.NoSuchAlgorithmException;

import?java.security.spec.InvalidKeySpecException;

public?class?OpenSSLPBEInputStream?extends?InputStream?{

private?final?static?int?READ_BLOCK_SIZE?=?64?*?1024;

private?final?Cipher?cipher;

private?final?InputStream?inStream;

private?final?byte[]?bufferCipher?=?new?byte[READ_BLOCK_SIZE];

private?byte[]?bufferClear?=?null;

private?int?index?=?Integer.MAX_VALUE;

private?int?maxIndex?=?0;

public?OpenSSLPBEInputStream(final?InputStream?streamIn,?String?algIn,?int?iterationCount,?char[]?password)

throws?IOException?{

this.inStream?=?streamIn;

try?{

byte[]?salt?=?readSalt();

cipher?=?OpenSSLPBECommon.initializeCipher(password,?salt,?Cipher.DECRYPT_MODE,?algIn,?iterationCount);

}?catch?(InvalidKeySpecException?|?NoSuchPaddingException?|?NoSuchAlgorithmException?|?InvalidKeyException?|?InvalidAlgorithmParameterException?e)?{

throw?new?IOException(e);

}

}

@Override

public?int?available()?throws?IOException?{

return?inStream.available();

}

@Override

public?int?read()?throws?IOException?{

if?(index?>?maxIndex)?{

index?=?0;

int?read?=?inStream.read(bufferCipher);

if?(read?!=?-1)?{

bufferClear?=?cipher.update(bufferCipher,?0,?read);

}

if?(read?==?-1?||?bufferClear?==?null?||?bufferClear.length?==?0)?{

try?{

bufferClear?=?cipher.doFinal();

}?catch?(IllegalBlockSizeException?|?BadPaddingException?e)?{

bufferClear?=?null;

}

}

if?(bufferClear?==?null?||?bufferClear.length?==?0)?{

return?-1;

}

maxIndex?=?bufferClear.length?-?1;

}

return?bufferClear[index++]?&?0xff;

}

private?byte[]?readSalt()?throws?IOException?{

byte[]?headerBytes?=?new?byte[OpenSSLPBECommon.OPENSSL_HEADER_STRING.length()];

inStream.read(headerBytes);

String?headerString?=?new?String(headerBytes,?OpenSSLPBECommon.OPENSSL_HEADER_ENCODE);

if?(!OpenSSLPBECommon.OPENSSL_HEADER_STRING.equals(headerString))?{

throw?new?IOException("unexpected?file?header?"?+?headerString);

}

byte[]?salt?=?new?byte[OpenSSLPBECommon.SALT_SIZE_BYTES];

inStream.read(salt);

return?salt;

}

}

輸出流:import?javax.crypto.BadPaddingException;

import?javax.crypto.Cipher;

import?javax.crypto.IllegalBlockSizeException;

import?javax.crypto.NoSuchPaddingException;

import?java.io.IOException;

import?java.io.OutputStream;

import?java.security.InvalidAlgorithmParameterException;

import?java.security.InvalidKeyException;

import?java.security.NoSuchAlgorithmException;

import?java.security.SecureRandom;

import?java.security.spec.InvalidKeySpecException;

public?class?OpenSSLPBEOutputStream?extends?OutputStream?{

private?static?final?int?BUFFER_SIZE?=?5?*?1024?*?1024;

private?final?Cipher?cipher;

private?final?OutputStream?outStream;

private?final?byte[]?buffer?=?new?byte[BUFFER_SIZE];

private?int?bufferIndex?=?0;

public?OpenSSLPBEOutputStream(final?OutputStream?outputStream,?String?algIn,?int?iterationCount,

char[]?password)?throws?IOException?{

outStream?=?outputStream;

try?{

/*?Create?and?use?a?random?SALT?for?each?instance?of?this?output?stream.?*/

byte[]?salt?=?new?byte[PBECommon.SALT_SIZE_BYTES];

new?SecureRandom().nextBytes(salt);

cipher?=?OpenSSLPBECommon.initializeCipher(password,?salt,?Cipher.ENCRYPT_MODE,?algIn,?iterationCount);

/*?Write?header?*/

writeHeader(salt);

}?catch?(InvalidKeySpecException?|?NoSuchPaddingException?|?NoSuchAlgorithmException?|?InvalidKeyException?|?InvalidAlgorithmParameterException?e)?{

throw?new?IOException(e);

}

}

@Override

public?void?write(int?b)?throws?IOException?{

buffer[bufferIndex]?=?(byte)?b;

bufferIndex++;

if?(bufferIndex?==?BUFFER_SIZE)?{

byte[]?result?=?cipher.update(buffer,?0,?bufferIndex);

outStream.write(result);

bufferIndex?=?0;

}

}

@Override

public?void?flush()?throws?IOException?{

if?(bufferIndex?>?0)?{

byte[]?result;

try?{

result?=?cipher.doFinal(buffer,?0,?bufferIndex);

outStream.write(result);

}?catch?(IllegalBlockSizeException?|?BadPaddingException?e)?{

throw?new?IOException(e);

}

bufferIndex?=?0;

}

}

@Override

public?void?close()?throws?IOException?{

flush();

outStream.close();

}

private?void?writeHeader(byte[]?salt)?throws?IOException?{

outStream.write(OpenSSLPBECommon.OPENSSL_HEADER_STRING.getBytes(OpenSSLPBECommon.OPENSSL_HEADER_ENCODE));

outStream.write(salt);

}

}

普通小班:import?javax.crypto.Cipher;

import?javax.crypto.NoSuchPaddingException;

import?javax.crypto.SecretKey;

import?javax.crypto.SecretKeyFactory;

import?javax.crypto.spec.PBEKeySpec;

import?javax.crypto.spec.PBEParameterSpec;

import?java.security.InvalidAlgorithmParameterException;

import?java.security.InvalidKeyException;

import?java.security.NoSuchAlgorithmException;

import?java.security.spec.InvalidKeySpecException;

class?OpenSSLPBECommon?{

protected?static?final?int?SALT_SIZE_BYTES?=?8;

protected?static?final?String?OPENSSL_HEADER_STRING?=?"Salted__";

protected?static?final?String?OPENSSL_HEADER_ENCODE?=?"ASCII";

protected?static?Cipher?initializeCipher(char[]?password,?byte[]?salt,?int?cipherMode,

final?String?algorithm,?int?iterationCount)?throws?NoSuchAlgorithmException,?InvalidKeySpecException,

InvalidKeyException,?NoSuchPaddingException,?InvalidAlgorithmParameterException?{

PBEKeySpec?keySpec?=?new?PBEKeySpec(password);

SecretKeyFactory?factory?=?SecretKeyFactory.getInstance(algorithm);

SecretKey?key?=?factory.generateSecret(keySpec);

Cipher?cipher?=?Cipher.getInstance(algorithm);

cipher.init(cipherMode,?key,?new?PBEParameterSpec(salt,?iterationCount));

return?cipher;

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541047.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541047.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java ArrayList set()方法與示例

ArrayList類set()方法 (ArrayList Class set() method) set() method is available in java.util package. set()方法在java.util包中可用。 set() method is used to replace the element at the given indices with the given ele(element) in this Arraylist. set()方法用于…

《R的極客理想—工具篇》—— 第2章 時間序列基礎包

本節書摘來自華章出版社《R的極客理想—工具篇》一 書中的第2章,作者:張丹,更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。 第2章 時間序列基礎包 本章主要介紹了時間序列數據處理的3個工具包,幫助讀者掌握時間序列在R語…

java結構設計_Java基本的程序設計結構(一)

前言:雖然說學過設計模式,J2EE,這個學期才開始學Java,呵呵,有點顛倒了,但是還是要從基本的抓起。hoho~~(一)一個簡單的java應用程序Package edu.ynu.java.lession1/*The simplest Ja…

Java ArrayList get()方法與示例

ArrayList類的get()方法 (ArrayList Class get() method) get() method is available in java.util package. get()方法在java.util包中可用。 get() method is used to retrieve the element at the given index in this Arraylist. get()方法用于檢索此Arraylist中給定索引處…

第三方應用商店仍為用戶獲取APP主渠道 細分市場或成新增長點

近年來,在應用分發市場領域隨著渠道多元化趨勢日漸顯現,第三方應用商店似乎已經顯得乏善可陳,缺少亮點。事實上,根據比達咨詢(Big Data-Research)發布的《2016年第一季度中國第三方應用商店市場研究報告》顯示,第三方應…

java反射 動態調用_java反射拼接方法名動態執行方法

近期由于負責項目的一個模塊,該模塊下有很多分類,每個分類都有一個編碼code,這個值是作為一個參數攜帶過來的.但是每個code確實對應一個方法的.code的值有很多個,自己又不想做ifelse或者switch判斷于是就狂搜資料,主要讓我發現利用java的反射機制可以完美的解決這個問題測試代碼…

Python | Lambda函數與示例

With the help of lambda function, we can create one line function definition. 借助lambda函數,我們可以創建一個行函數定義。 Note: Function must have return type and parameter 注意:函數必須具有返回類型和參數 Example: 例: Co…

使用大數據閃存打造融合數據平臺

隨著企業、服務提供商和超大型數據中心從描述性分析向預測性和規范性分析演進,結合了融合運營和分析數據管道的融合數據平臺變得日益重要。大數據閃存可讓數據處理平臺快速訪問歷史數據和實時數據流,從而以較低成本創建有效的預測模型。 隨著大數據從描述…

stl min函數_std :: min()函數以及C ++ STL中的示例

stl min函數C STL std :: min()函數 (C STL std::min() function) min() function is a library function of algorithm header, it is used to find the smallest value from given two values, it accepts two values and returns the smallest value and if both the value…

c# uri.host_C#| Uri.FromHex()方法與示例

c# uri.hostUri.FromHex()方法 (Uri.FromHex() Method) Uri.FromHex() method is a static method that returns an integer that represents a decimal digit of specified hex char. Uri.FromHex()方法是一個靜態方法,該方法返回一個整數,該整數表示指…

中國制造2025變革,背后的大數據來龍去脈

大數據的成長路徑一定是個長期成長過程,實用分析工具與先進分析理念,真正釋放數字化分析的力量,由人類軌跡產生的數據,與機器自動產生的數據得出洞見,從管理決策推導運營方案,最終實現數據價值提升。無論是…

java 文件下載 jsp文件_jsp文件 Java實現文件上傳與下載

通過前臺選擇文件,然后將資源上傳到(即新建一個文件)到發布的資源文件下面,下載就是url 到發布的資源文件,觸發即可自動下載。服務器已經封裝了如何下載的底層實現。(此處用的是tomcat)JSP上傳文件方法:關于在HTTP request 中通過…

ruby hash方法_Ruby中帶有示例的Hash.flatten方法

ruby hash方法哈希平化方法 (Hash.flatten Method) In this article, we will study about Hash.flatten Method. The working of this method can be predicted with the help of its name but it is not as simple as it seems. Well, we will understand this method with t…

浙江嘉興“網事”再添國字招牌 領跑城市智慧轉型

16日,舉世矚目的第三屆世界互聯網大會如期而至。世界目光再次聚焦“烏鎮時間”,人們不禁發現,流淌千年的水網已與迅猛發展的互聯網交相輝映,1300多年的古鎮釋放出強烈的互聯網信號。更令人驚喜的是,互聯網形成的沖擊波…

java list過濾重復的數據_List 去除重復數據的 5 種正確姿勢!

以下介紹五種-不同的方法去除 Java 中ArrayList中的重復數據1.使用LinkedHashSet刪除arraylist中的重復數據LinkedHashSet是在一個ArrayList刪除重復數據的最佳方法。LinkedHashSet在內部完成兩件事:刪除重復數據保持添加到其中的數據的順序Java示例使用LinkedHashS…

打擊侵犯公民個人信息罪的司法困境

當前,公民個人信息泄露并屢遭侵犯已成為社會關注焦點。泄露的信息輕則給被害人生活造成困擾,重則使被害人陷入電信詐騙、敲詐勒索等犯罪漩渦,造成重大人身、財產損失。一些民眾認為,對侵犯公民個人信息行為的刑事打擊很不給力&…

ruby中、.reject_Ruby中帶有示例的Array.reject方法

ruby中、.rejectRuby Array.reject方法 (Ruby Array.reject Method) In the last article, we have seen how we can make use of the Array.select method in order to print the Array elements based on certain conditions provided inside the block? In this article, w…

java獲取主機mac_Java 如何獲取主機的MAC地址

獲取MAC地址首先要理解當前的操作系統,由于在不同的操作系統中CMD命令所在的位置不同,因此首先使用System類中的getProperty("os.name")方法獲取當前的操作系統,getProperty()方法可以確定當前系統屬性,它的參數是一些固…

微軟免費軟件項目DreamSpark更名為Microsoft Imagine

9月10日消息,微軟免費軟件項目DreamSpark近日正式更名為Microsoft Imagine,將與一年一度的微軟“創新杯(Imagine Cup)”齊名。微軟免費軟件項目DreamSpark更名為Microsoft Imagine  2008年2月19日,微軟公司董事長比爾蓋茨在斯坦福大學發布了…

java jpa_Java JPA 語法知識

前提操作創建一個可持久化的實體類dao層繼承JpaRepositoryT:實體類ID:實體類的主鍵類型例:public interface SysUserRespository extends JpaRepository {}JPA中支持的關鍵詞And --- 等價于 SQL 中的 and 關鍵字,比如 findByUsern…