Byte_
16.03.2010, 13:05
Пытаюсь реализовать base64 "на коленке". Просто для практики (про существование готового решения я знаю).
Шифрование:
public void actionPerformed(ActionEvent e)
{
status.setText("Идёт обработка...");
try
{
int size;
InputStream is = new FileInputStream(inpFile.getText());
size = is.available();
int ost = size%3;
if(ost == 1)
{
size += 2;
}else if(ost == 2)
{
size += 1;
}
int bnSize = (size/3)*4;
byte[] b = new byte[size];
byte[] bn = new byte[bnSize];
is.read(b);
is.close();
int j = 0;
for(int i = 0;i<size;i+=3)
{
bn[j] = (byte) ((b[i] & 0xfc) >> 2);
bn[j+1] = (byte) (((b[i] & 0x03) << 4) + ((b[i+1] & 0xf0) >> 4));
bn[j+2] = (byte) (((b[i+1] & 0x0f) << 2) + ((b[i+2] & 0xc0) >> 6));
bn[j+3] = (byte) (b[i+2] & 0x3f);
j+=4;
}
String res = new String("");
for(int i = 0;i < bnSize;i++)
{
res += b64_k.charAt(bn[i]);
}
if(ost == 1)
{
res = res.substring(0,res.length() - 2) + "==";
}else if(ost == 2)
{
res = res.substring(0,res.length() - 1) + "=";
}
OutputStream os = new FileOutputStream(outFile.getText());
os.write(res.getBytes());
os.close();
status.setText("Обработка завершена. Программа готова.");
}catch(Exception ex)
{
status.setText("Обработка завершена с ошибкой " + ex.getMessage() + ". Программа готова.");
}
}
Расшифровка:
public void actionPerformed(ActionEvent e)
{
status.setText("Идёт обработка...");
try
{
int size;
InputStream is = new FileInputStream(inpFile.getText());
size = is.available();
byte[] b = new byte[size];
is.read(b);
is.close();
int bnSize = (size/4)*3;
byte[] bn = new byte[bnSize];
int j = 0;
for(int i = 0;i < size;i+=4)
{
bn[j] = (byte) ((b[i] << 2) + ((b[i+1] & 0x03) >> 4));
bn[j+1] = (byte) (((b[i+1] & 0xf) << 4) + ((b[i+2] & 0x3c) >> 2));
bn[j+2] = (byte) (((b[i+2] & 0x3) << 6) + b[i+3]);
j+=3;
}
System.out.println(new String(bn));
status.setText("Обработка завершена. Программа готова.");
}catch(Exception ex)
{
status.setText("Обработка завершена с ошибкой " + ex.getMessage() + ". Программа готова.");
}
}
Проблема в том, что зашифровывает отлично, а расшифровывает не корректно (возвращает муть). 2 дня разбираюсь, не могу понять в чём проблема.
Если кто разбирается в алгоритмизации, буду благодарен. Просто заклинило =)
Шифрование:
public void actionPerformed(ActionEvent e)
{
status.setText("Идёт обработка...");
try
{
int size;
InputStream is = new FileInputStream(inpFile.getText());
size = is.available();
int ost = size%3;
if(ost == 1)
{
size += 2;
}else if(ost == 2)
{
size += 1;
}
int bnSize = (size/3)*4;
byte[] b = new byte[size];
byte[] bn = new byte[bnSize];
is.read(b);
is.close();
int j = 0;
for(int i = 0;i<size;i+=3)
{
bn[j] = (byte) ((b[i] & 0xfc) >> 2);
bn[j+1] = (byte) (((b[i] & 0x03) << 4) + ((b[i+1] & 0xf0) >> 4));
bn[j+2] = (byte) (((b[i+1] & 0x0f) << 2) + ((b[i+2] & 0xc0) >> 6));
bn[j+3] = (byte) (b[i+2] & 0x3f);
j+=4;
}
String res = new String("");
for(int i = 0;i < bnSize;i++)
{
res += b64_k.charAt(bn[i]);
}
if(ost == 1)
{
res = res.substring(0,res.length() - 2) + "==";
}else if(ost == 2)
{
res = res.substring(0,res.length() - 1) + "=";
}
OutputStream os = new FileOutputStream(outFile.getText());
os.write(res.getBytes());
os.close();
status.setText("Обработка завершена. Программа готова.");
}catch(Exception ex)
{
status.setText("Обработка завершена с ошибкой " + ex.getMessage() + ". Программа готова.");
}
}
Расшифровка:
public void actionPerformed(ActionEvent e)
{
status.setText("Идёт обработка...");
try
{
int size;
InputStream is = new FileInputStream(inpFile.getText());
size = is.available();
byte[] b = new byte[size];
is.read(b);
is.close();
int bnSize = (size/4)*3;
byte[] bn = new byte[bnSize];
int j = 0;
for(int i = 0;i < size;i+=4)
{
bn[j] = (byte) ((b[i] << 2) + ((b[i+1] & 0x03) >> 4));
bn[j+1] = (byte) (((b[i+1] & 0xf) << 4) + ((b[i+2] & 0x3c) >> 2));
bn[j+2] = (byte) (((b[i+2] & 0x3) << 6) + b[i+3]);
j+=3;
}
System.out.println(new String(bn));
status.setText("Обработка завершена. Программа готова.");
}catch(Exception ex)
{
status.setText("Обработка завершена с ошибкой " + ex.getMessage() + ". Программа готова.");
}
}
Проблема в том, что зашифровывает отлично, а расшифровывает не корректно (возвращает муть). 2 дня разбираюсь, не могу понять в чём проблема.
Если кто разбирается в алгоритмизации, буду благодарен. Просто заклинило =)