AES加密算法
ExcelUtil.class
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; public class ExcelUtil { public static void export(ArrayList<DataOne> ones,String exportPath) { try { // File file = new File(exportPath+name); // 判断文件是否存在,不存在就新建 // if (!file.exists()) { // file.mkdirs(); // } String path = exportPath; // 创建一个Excel文件对象(工作簿) Workbook workBook = new XSSFWorkbook(); // 创建一个sheet对象 Sheet sheet = workBook.createSheet(); Row rowOne = sheet.createRow(0); // sheet创建行对象(表头行) for (int i = 0; i < 9; i++) { Cell cell = rowOne.createCell(i); // 创建列 switch (i) { case 0: cell.setCellValue("VIN"); break; case 1: cell.setCellValue("CONTRACT_CURRENT_FLAG"); break; case 2: cell.setCellValue("DEALER_NAME"); break; case 3: cell.setCellValue("DEALER_CODE"); break; case 4: cell.setCellValue("COMBINED_ENCRYPT"); break; case 5: cell.setCellValue("HASH_CODE"); break; case 6: cell.setCellValue("CODE_END"); break; //------------------ // case 7: // cell.setCellValue("DEALER_ENCRYPTION_KEY"); // break; // case 8: // cell.setCellValue("IV"); // break; //------------------ } } // 往工作簿插入数据 for (int i = 0; i < ones.size(); i++) { Row row = sheet.createRow(i + 1); // 从第二行开始 Cell cell0 = row.createCell(0); // 第一列 cell0.setCellValue(ones.get(i).getVin()); Cell cell1 = row.createCell(1); // 第二列 cell1.setCellValue(ones.get(i).getConteactCurrentFlag()); Cell cell2 = row.createCell(2);// 第三列 cell2.setCellValue(ones.get(i).getName()); Cell cel3 = row.createCell(3);// 第四列 cel3.setCellValue(ones.get(i).getDealerCode()); Cell cell4 = row.createCell(4);// 第第五列 cell4.setCellValue(ones.get(i).getCombinedEncrypt()); Cell cell5 = row.createCell(5);// 第第6列 cell5.setCellValue(ones.get(i).getHaseCode()); Cell cell6 = row.createCell(6);// 第第7列 cell6.setCellValue(ones.get(i).getCodeEnd()); //------------------ // Cell cell7 = row.createCell(7);// 第第8列 // cell7.setCellValue(ones.get(i).getKey()); // // Cell cell8 = row.createCell(8);// 第第9列 // cell8.setCellValue(ones.get(i).getIv()); //------------------ } // 输出Excel文件 FileOutputStream out = new FileOutputStream(path); workBook.write(out); out.flush(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
DataOne.class
public class DataOne { public DataOne() { } public String getVin() { return vin; } public void setVin(String vin) { this.vin = vin; } public String getConteactCurrentFlag() { return conteactCurrentFlag; } public void setConteactCurrentFlag(String conteactCurrentFlag) { this.conteactCurrentFlag = conteactCurrentFlag; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDealerCode() { return dealerCode; } public void setDealerCode(String dealerCode) { this.dealerCode = dealerCode; } public String getCombinedEncrypt() { return combinedEncrypt; } public void setCombinedEncrypt(String combinedEncrypt) { this.combinedEncrypt = combinedEncrypt; } public String getHaseCode() { return haseCode; } public void setHaseCode(String haseCode) { this.haseCode = haseCode; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } @Override public String toString() { return "DataOne{" + "vin='" + vin + '\'' + ", conteactCurrentFlag='" + conteactCurrentFlag + '\'' + ", name='" + name + '\'' + ", dealerCode='" + dealerCode + '\'' + ", combinedEncrypt='" + combinedEncrypt + '\'' + ", haseCode='" + haseCode + '\'' + ", key='" + key + '\'' + ", iv='" + iv + '\'' + ", codeEnd='" + codeEnd + '\'' + '}'; } private String vin; private String conteactCurrentFlag; private String name; private String dealerCode; private String combinedEncrypt; private String haseCode; private String key; private String iv; private String codeEnd; public String getCodeEnd() { return codeEnd; } public void setCodeEnd(String codeEnd) { this.codeEnd = codeEnd; } public String getIv() { return iv; } public void setIv(String iv) { this.iv = iv; } }
ExcelData.class
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.LinkedHashMap; import org.apache.poi.ss.usermodel.CellType; import java.io.*; import java.util.List; import java.util.Map; /** * Author: 灵枢 * Time: 17:21 * Description:读取Excel数据 */ public class ExcelData { /** * 读取excel内容 * <p> * 用户模式下: * 弊端:对于少量的数据可以,单数对于大量的数据,会造成内存占据过大,有时候会造成内存溢出 * 建议修改成事件模式 */ public static List<Map<String, String>> redExcel(String filePath) throws Exception { File file = new File(filePath); if (!file.exists()){ throw new Exception("文件不存在!"); } InputStream in = new FileInputStream(file); // 读取整个Excel XSSFWorkbook sheets = new XSSFWorkbook(in); // 获取第一个表单Sheet XSSFSheet sheetAt = sheets.getSheetAt(0); ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>(); //默认第一行为标题行,i = 0 XSSFRow titleRow = sheetAt.getRow(0); // 循环获取每一行数据 for (int i = 1; i < sheetAt.getPhysicalNumberOfRows(); i++) { XSSFRow row = sheetAt.getRow(i); LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); // 读取每一格内容 for (int index = 0; index < row.getPhysicalNumberOfCells(); index++) { XSSFCell titleCell = titleRow.getCell(index); XSSFCell cell = row.getCell(index); // cell.setCellType(XSSFCell.CELL_TYPE_STRING); 过期,使用下面替换 cell.setCellType(CellType.STRING); if (cell.getStringCellValue().equals("")) { continue; } map.put(getString(titleCell), getString(cell)); } if (map.isEmpty()) { continue; } list.add(map); } return list; } /** * 把单元格的内容转为字符串 * * @param xssfCell 单元格 * @return String */ public static String getString(XSSFCell xssfCell) { if (xssfCell == null) { return ""; } if (xssfCell.getCellTypeEnum() == CellType.NUMERIC) { return String.valueOf(xssfCell.getNumericCellValue()); } else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) { return String.valueOf(xssfCell.getBooleanCellValue()); } else { return xssfCell.getStringCellValue(); } } }
AESUtil.class
import java.io.File; import java.security.Security; import java.security.spec.AlgorithmParameterSpec; import java.text.SimpleDateFormat; import java.util.*; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import com.sun.istack.internal.NotNull; public class AESUtil { private static final String CHARSET_NAME = "UTF-8"; private static final String AES_NAME = "AES"; // 加密模式 public static final String ALGORITHM = "AES/CBC/PKCS7Padding"; // 密钥 // public static final String KEY = "6agrioBE1D9yoGOX4yyDMyMFs72jYvJ8"; // // 位偏移 // public static final String IV = "6agrioBE1D9yoGOX"; static { Security.addProvider(new BouncyCastleProvider()); } /*加密*/ public String encrypt(@NotNull String content,String key,String iv) { byte[] result = null; try { Cipher cipher = Cipher.getInstance(ALGORITHM); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CHARSET_NAME), AES_NAME); AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec); result = cipher.doFinal(content.getBytes(CHARSET_NAME)); } catch (Exception e) { e.printStackTrace(); } return Base64.encodeBase64String(result); } /* * 解密 */ // public String decrypt(@NotNull String content,String key,String iv) { // try { // Cipher cipher = Cipher.getInstance(ALGORITHM); // SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CHARSET_NAME), AES_NAME); // AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv.getBytes()); // cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec); // return new String(cipher.doFinal(Base64.decodeBase64(content)), CHARSET_NAME); // } catch (Exception e) { // e.printStackTrace(); // } // return StringUtils.EMPTY; // } /** * 读取加密前的exexl 返回一个集合对象 * @param path * @return */ public static HashSet<DataOne> getDataOnes(String path){ HashSet<DataOne> ones = new HashSet<DataOne>(); ExcelData excelData = new ExcelData(); try { List<Map<String, String>> maps = ExcelData.redExcel(path); for (Map<String, String> map : maps) { Set<String> ks = map.keySet(); Iterator<String> it = ks.iterator(); DataOne one = new DataOne(); while(it.hasNext()){ String n = it.next(); if(n.equals("CONTRACT_CURRENT_FLAG")){ one.setConteactCurrentFlag(map.get(n)); }else if(n.equals("VIN")){ one.setVin(map.get(n)); }else if(n.equals("DEALER_ENCRYPTION_KEY")){ one.setKey(map.get(n)); one.setIv(map.get(n).substring(0,16)); }else if(n.equals("DEALER_NAME")){ one.setName(map.get(n)); }else if(n.equals("DEALER_CODE")){ one.setDealerCode(map.get(n)); }else if(n.equals("COMBINED_ENCRYPT")){ one.setCombinedEncrypt(map.get(n)); }else if(n.equals("HASH_CODE")){ one.setHaseCode(map.get(n)); } ones.add(one); } } }catch (Exception e){ System.out.println(e); } return ones; } /** * 输入txt路径和输出execl表路劲 * @return */ public static void show(String txtPath,String execlPath){ String s = TxtTest.txt2String(new File(txtPath)); HashSet<DataOne> ones = getDataOnes(s.trim()); // System.out.println(s); for (DataOne one : ones) { AESUtil aes = new AESUtil(); String contents = one.getCombinedEncrypt(); String encrypt = aes.encrypt(contents,one.getKey(),one.getIv()); // System.out.println("加密后:" + encrypt); one.setCodeEnd(encrypt); System.out.println(one); // String decrypt = aes.decrypt(encrypt,one.getKey(),one.getIv()); // System.out.println("解密后:" + decrypt); } ExcelUtil.export(new ArrayList<DataOne>(ones),execlPath); } public static void main(String[] args) { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("yyyyMMdd"); String timeNow = ft.format(dNow); AESUtil.show("src/main/re/pathADDCode.txt", "C:/sf_eot_AddCode"+timeNow+".csv"); } }
TxtTest.class
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public class TxtTest { /** * 读取txt文件的内容 * * @param file 想要读取的文件对象 * @return 返回文件内容 */ public static String txt2String(File file) { String result = ""; try { BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件 String s = null; while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行 result = result + "\n" + s; } br.close(); } catch (Exception e) { e.printStackTrace(); } return result; } }
pom.xml
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.hadoop.sgz.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency> <dependency> <groupId>org.apache.directory.studio</groupId> <artifactId>org.apache.commons.codec</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.64</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.64</version> </dependency> </dependencies>