- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
public class EncryptedLogger {
private static Date lastLogTime = null;
private static EncryptedLogger instance = null;
private static FileOutputStream fos = null;
private static CipherOutputStream cos = null;
private static PrintWriter writer = null;
private Cipher cipher;
byte[] Key ={(byte) 0x12,(byte) 0x34,0x55,(byte) 0x66,0x67,(byte)0x88,(byte)0x90,0x12,(byte) 0x23,0x45,0x67,(byte)0x89,0x12,0x33,(byte) 0x55,0x74};
public static EncryptedLogger getInstance(){
if (instance==null) {
instance = new EncryptedLogger();
}
return instance;
}
private EncryptedLogger(){
class SQLShutdownHook extends Thread{
@Override
public void run() {
EncryptedLogger.close();
super.run();
}
}
SecretKeySpec sks = new SecretKeySpec(Key,"AES");
try {
cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE,sks);
fos = new FileOutputStream(new File("log.txt"),true);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
cos = new CipherOutputStream(fos, cipher);
writer = new PrintWriter(cos);
SQLShutdownHook hook = new SQLShutdownHook();
Runtime.getRuntime().addShutdownHook(hook);
}
public synchronized void logSQL(String s){
if ((lastLogTime==null)||((new Date().getTime() -lastLogTime.getTime())>1000)){
lastLogTime = new Date();
writer.printf("-- %1$tm-%1$te-%1$tY %1$tH-%1$tM-%1$tS\n%2$s\n",new Date(),s);
}
else{
writer.println(s);
}
}
public synchronized void logComment(String s){
writer.printf("-- %1$tm-%1$te-%1$tY %1$tH-%1$tM-%1$tS: %2$s\n",new Date(),s);
}
public static void close(){
writer.flush();
writer.close();
}
public static void main(String[] args) throws InterruptedException {
EncryptedLogger.getInstance().logSQL("1");
EncryptedLogger.getInstance().logSQL("22");
EncryptedLogger.getInstance().logSQL("33333");
EncryptedLogger.getInstance().logSQL("4900");
EncryptedLogger.getInstance().logSQL("5");
EncryptedLogger.getInstance().logSQL("66666");
EncryptedLogger.getInstance().logSQL("Some test logging statement");
EncryptedLogger.getInstance().logSQL("AAAAAAAAAAAAAAAAAAAAAAAAAA");
EncryptedLogger.getInstance().logComment("here is test commentary");
}
}
如您所见,我正在尝试通过 PrintWriter->CipherOutputStream->FileOutputStream 链对文本条目进行加密。但是当我解密结果文件时,缺少字节。我尝试在 EncryptedLogger.close() 方法中刷新 cos 和 fos - 结果相同。显然我错过了一些东西。怎么了?
编辑:这是我使用的解密代码。这不是我的,取自教程之类的......当使用类似的加密时它工作得很好。但是当使用我的代码时...
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AESDecrypter
{
Cipher dcipher;
public AESDecrypter(SecretKey key)
{
try
{
dcipher = Cipher.getInstance("AES");
dcipher.init(Cipher.DECRYPT_MODE, key);
}
catch (Exception e)
{
e.printStackTrace();
}
}
byte[] buf = new byte[1024];
public void decrypt(InputStream in, OutputStream out)
{
System.out.println("decrypting");
try
{
in = new CipherInputStream(in, dcipher);
int numRead = 0;
while ((numRead = in.read(buf)) >= 0)
{
out.write(buf, 0, numRead);
}
out.close();
}
catch (java.io.IOException e)
{
}
}
public static void main(String args[])
{
try
{
byte[] keystr ={(byte) 0x12,(byte) 0x34,0x55,(byte) 0x66,0x67,(byte)0x88,(byte)0x90,0x12,(byte) 0x23,0x45,0x67,(byte)0x89,0x12,0x33,(byte) 0x55,0x74};
SecretKeySpec sks = new SecretKeySpec(keystr,"AES");
AESDecrypter encrypter = new AESDecrypter(sks);
encrypter.decrypt(new FileInputStream("sqllogenc.log"),new FileOutputStream("sqllogdec.log"));
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
EDIT2:当我直接写入fos时,我得到以下输出:
-- 04-19-2012 16-17-56
1
22
33333
4900
5
66666 + delay starting 1100
Some test logging statement
AAAAAAAAAAAAAAAAAAAAAAAAAA
-- 04-19-2012 16-17-56: here is test commentary
当使用cos写入并解密时:
-- 04-19-2012 16-22-13
1
22
33333
4900
5
66666 + delay starting 1100
Some test logging statement
AAAAAAAAAAAAAAAAAAAAAAAAAA
-- 04-19-2012 16-22-13: here
正如您所看到的,最后一行的一部分丢失了,包括换行符。
最佳答案
您应该在两侧使用相同的加密转换(例如 AES/ECB/NoPadding)。另请注意,NoPadding 模式不允许您传递任意大小的数据,因此您需要指定其他类型的填充。
因此,您需要在两侧将 Cipher
构造为 Cipher.getInstance("AES/ECB/PKCS5Padding")
。
另外,请注意 rossum 关于使用 CBC
或 CTR
而不是 ECB
的建议。
关于java - 管道 PrintWriter->CipherOutputStream->FileOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228138/
在这个程序中,第三个字符串永远不会被打印出来。为什么? (此 Java 程序在 Ubuntu 10.10 上的 Eclipse Indigo 上运行。) import java.io.PrintWri
我已经使用 Java 执行任务和支持工具有一段时间了,但我从未弄清楚如何在一个类中使用 PrintWriter ,然后我可以从另一个类中使用它,例如,我我有几个要解析的 XML 文件,然后从单个输入源
Java PrintWriter 方法printf 和format 之间有什么区别吗? 文档说 printf 是一种方便的方法,但如果它的行为与 format 完全一致,所以我不明白它有什么方便之处。
我正在处理一个服务器-客户端程序集,但现在我遇到了协议(protocol)问题,因为 println 语句末尾的新行混淆了元数据。 换句话说,我需要打印到 PrintWriter,末尾不带新行。我尝试
我想知道有没有可能做 new PrintWriter(new BufferedWriter(new PrintWriter(s.getOutputStream, true))) 在 Java 中,s
PrintWriter(OutputStream out) 此方法不会自动刷新行。 PrintWriter(OutputStream out, boolean autoFlush) 此方法执行自动行冲
我只是想将二维数组“拼图”写入文件。我有一个双 for 循环,它读取数组中的每个“char”值,并将它们写入文件。我似乎无法在我的代码中找到错误。该文件说它在我运行程序时已被修改,但它仍然是空白的。谢
我正在尝试从数据库写入一个大文件文本,大约 200 万行。我观察到,当 PrintWriter 打印 (println()) 行时,文件大小始终为 0 字节。流关闭后文件具有大小数据。它导致所有数据首
public PrintWriter(OutputStream out, boolean autoFlush) : out - An output stream autoFlush - A boole
我的PrintWriter对象编写器的print()方法不起作用,我导入了所有适当的类,但CSV文件一直显示为空白。谁能告诉我为什么? public class StateStats { st
我在这里遇到一个问题:我让这个程序打印 0 到 1000 之间的所有偶数,但是在 friend 做了一些更改之后,它现在只打印“0”。我已经使用它一段时间了,无法弄清楚这是循环问题还是打印机问题。我从
try{ pw = new PrintWriter("C:\\Users\\SDSAD\\Desktop\\java\\file.txt"); }catch(Exception exc){
与我的问题相关的代码功能的主要摘要:该代码采用国会成员数组并以两种不同的方法对它们进行排序;一种按名字排序,一种按平均支持率排序。然后,代码将两个新排序的数组输出到 txt 文件中。 我正在处理的问题
我正在尝试解析一些链接,然后将信息存储在文本文件中,我拥有应在列表中解析的所有链接,但是在解析和存储有关 100 个链接的信息后,我收到了我真的无法理解的错误为什么会发生这种情况,这是我的代码: fo
我真的不明白问题出在哪里。我想将字符打印到文本文件中,并且我使用 printWriter 来执行相同的操作。如果文件有一个“;”,我想用一个新行替换它,这就是我正在做的, public static
我的问题非常简单,如果我有一个长字符串,其中有很多“\n”换行符,即: strings = "Hey\nThere\nFriend\n" 并使用 Java 中的 PrintWriter 执行以下操作:
我有一个将信息存储到二叉树中的程序。 我正在尝试使用 PrintWriter 将所有信息打印到文本文件中,这在以前的情况下对我有用,但这次我没有运气。 必须通过对象在节点中调用信息。我已经调试并确定树
This question already has answers here: PrintWriter writes only partial text (5 个回答) 7 个月前关闭。 我在某个网站
您好,正在开发一个将数据写入文件的小程序。我使用 if else 语句进行验证,因此我需要在单独的方法中使用 PrintWriter 和 FileWriter 类/声明。然后我使用主类的构造函数调用此
我需要打印 100 多行数据和统计数据。我正在使用: PrintWriter p = new PrintWriter(fileName); 之所以大约有 100 行,是因为我需要打印到系统和文件(每个
我是一名优秀的程序员,十分优秀!