- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我发现了一个问题,Elephantik 的答案基本上回答了我的问题: DES Initialization Vector in C#
我有一个使用 DES.EXE 命令行工具加密的文件。我可以使用以下命令解密它:“des -D -k YSTxyHBH file.cr file.txt”
通过这个命令,我得到了一个解密的 file.txt,但我需要在 Java 中解密这个文件。
所以我尝试将解决方案从 Elephantik 转移到 Java,但我的解决方案一定有问题,因为结果当我调用 cryptoData(...) 方法时我只得到一些加密文本。
public byte[] decryptData(byte input[], String password) throws Exception {
byte[] result = null;
//Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
//byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0 };
byte[] iv = { -128, -128, -128, -128, -128, -128, -128, -128 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, generateSecretKey(passwordToKey(password)), ivspec);
result = cipher.doFinal(input);
return result;
}
protected SecretKey generateSecretKey(byte[] key) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
KeySpec keySpec = new DESKeySpec(key);
SecretKey secretKey = factory.generateSecret(keySpec);
return secretKey;
}
public byte[] passwordToKey(String password) throws Exception
{
if (password == null)
throw new IllegalArgumentException("password");
if (password == "")
throw new IllegalArgumentException("password");
byte[] key = new byte[8];
for (int i = 0; i < password.length(); i++)
{
int c = (int)password.charAt(i);
if ((i % 16) < 8)
{
key[i % 8] ^= (byte)(c << 1);
}
else
{
// reverse bits e.g. 11010010 -> 01001011
c = (((c << 4) & 0xf0) | ((c >> 4) & 0x0f));
c = (((c << 2) & 0xcc) | ((c >> 2) & 0x33));
c = (((c << 1) & 0xaa) | ((c >> 1) & 0x55));
key[7 - (i % 8)] ^= (byte)c;
}
}
addOddParity(key);
byte[] target = new byte[8];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
outputStream.write(password.getBytes("US-ASCII"));
outputStream.write(new byte[8]);
byte[] temp = outputStream.toByteArray();
outputStream = new ByteArrayOutputStream( );
for (int i = 0; i < (password.length() + (8 - (password.length() % 8)) % 8); ++i) {
outputStream.write(temp[i]);
}
byte[] passwordBuffer = outputStream.toByteArray();
Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
//byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0 };
byte[] iv = { -128, -128, -128, -128, -128, -128, -128, -128 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, generateSecretKey(key), ivspec);
for (int x = 0; x < passwordBuffer.length / 8; ++x)
{
cipher.update(passwordBuffer, 8 * x, 8, target, 0);
}
addOddParity(target);
return target;
}
private void addOddParity(byte[] buffer)
{
for (int i = 0; i < buffer.length; ++i)
{
buffer[i] = _oddParityTable[buffer[i] & 0xFF];
}
}
private static byte[] _oddParityTable = {
-127,-127,-126,-126,-124,-124,-121,-121,-120,-120,-117,-117,-115,-115,-114,-114,
-112,-112,-109,-109,-107,-107,-106,-106,-103,-103,-102,-102,-100,-100, -97, -97,
-96, -96, -93, -93, -91, -91, -90, -90, -87, -87, -86, -86, -84, -84, -81, -81,
-79, -79, -78, -78, -76, -76, -73, -73, -72, -72, -69, -69, -67, -67, -66, -66,
-64, -64, -61, -61, -59, -59, -58, -58, -55, -55, -54, -54, -52, -52, -49, -49,
-47, -47, -46, -46, -44, -44, -41, -41, -40, -40, -37, -37, -35, -35, -34, -34,
-31, -31, -30, -30, -28, -28, -25, -25, -24, -24, -21, -21, -19, -19, -18, -18,
-16, -16, -13, -13, -11, -11, -10, -10, -7, -7, -6, -6, -4, -4, -1, -1,
0, 0, 3, 3, 5, 5, 6, 6, 9, 9, 10, 10, 12, 12, 15, 15,
17, 17, 18, 18, 20, 20, 23, 23, 24, 24, 27, 27, 29, 29, 30, 30,
33, 33, 34, 34, 36, 36, 39, 39, 40, 40, 43, 43, 45, 45, 46, 46,
48, 48, 51, 51, 53, 53, 54, 54, 57, 57, 58, 58, 60, 60, 63, 63,
65, 65, 66, 66, 68, 68, 71, 71, 72, 72, 75, 75, 77, 77, 78, 78,
80, 80, 83, 83, 85, 85, 86, 86, 89, 89, 90, 90, 92, 92, 95, 95,
96, 96, 99, 99, 101, 101, 102, 102, 105, 105, 106, 106, 108, 108, 111, 111,
113, 113, 114, 114, 116, 116, 119, 119, 120, 120, 123, 123, 125, 125, 126, 126
};
最佳答案
Michael,我在你的代码中发现了一些错误。检查行 cipher.init(Cipher.ENCRYPT_MODE,generateSecretKey(key), ivspec);
您需要传递相同的 key 作为初始化 vector ,但不是您拥有的 IV。 des.exe程序基于LibDes的源代码图书馆。您可以在文档和源代码中找到所有详细信息。您提到了 des -D
参数。这意味着您需要使用CBC/NoPadding模式解密DES。另请检查您拥有的 _oddParityTable
方法。
如果您的文件未经过 UUdecoded,请忽略我的代码中的相关部分。
这里是准备好的 Java 示例:
public class UUDES {
public static void main (String[] args) throws Exception
{
String password = "xxxxxx";
String pathToUUEencodedEncryptedFile = "C:\DES\path-to-decoded-and-encrypted-file";
byte[] secretKey = passwordToKey(password);
byte[] iv = new byte[8];
byte[] uuEncodedFile = Files.readAllBytes(Paths.get(pathToUUEencodedEncryptedFile));
SecretKey key = new SecretKeySpec(secretKey, "DES");
Cipher decryptor = Cipher.getInstance("DES/CBC/NoPadding");
decryptor.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
InputStream in = null;
try {
in = MimeUtility.decode(new ByteArrayInputStream(uuEncodedFile), "uuencode");
byte[] buf = new byte[1024];
int length;
while (true) {
length = in.read(buf);
if (length == -1) {
break;
}
bout.write(buf, 0, length);
}
byte[] bytesDecrypted = decryptor.doFinal(bout.toByteArray());
ByteArrayInputStream bais = new ByteArrayInputStream(bytesDecrypted);
GZIPInputStream gzis = new GZIPInputStream(bais);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader buffer = new BufferedReader(reader);
String readed;
while ((readed = buffer.readLine()) != null) {
System.out.println(readed);
}
}
finally {
if (in != null) {
try {
in.close();
}
catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
static SecretKey generateSecretKey(byte[] key) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
KeySpec keySpec = new DESKeySpec(key);
SecretKey secretKey = factory.generateSecret(keySpec);
return secretKey;
}
static byte[] passwordToKey(String password) throws Exception
{
if (password == null)
throw new IllegalArgumentException("password");
if (password == "")
throw new IllegalArgumentException("password");
byte[] key = new byte[8];
for (int i = 0; i < password.length(); i++)
{
int c = (int)password.charAt(i);
if ((i % 16) < 8)
{
key[i % 8] ^= (byte)(c << 1);
}
else
{
// reverse bits e.g. 11010010 -> 01001011
c = (((c << 4) & 0xf0) | ((c >> 4) & 0x0f));
c = (((c << 2) & 0xcc) | ((c >> 2) & 0x33));
c = (((c << 1) & 0xaa) | ((c >> 1) & 0x55));
key[7 - (i % 8)] ^= (byte)c;
}
}
addOddParity(key);
byte[] target = new byte[8];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
outputStream.write(password.getBytes("US-ASCII"));
outputStream.write(new byte[8]);
byte[] temp = outputStream.toByteArray();
outputStream = new ByteArrayOutputStream( );
for (int i = 0; i < (password.length() + (8 - (password.length() % 8)) % 8); ++i) {
outputStream.write(temp[i]);
}
byte[] passwordBuffer = outputStream.toByteArray();
Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
byte[] iv = key;
IvParameterSpec ivspec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, generateSecretKey(key), ivspec);
for (int x = 0; x < passwordBuffer.length / 8; ++x)
{
cipher.update(passwordBuffer, 8 * x, 8, target, 0);
}
addOddParity(target);
return target;
}
static void addOddParity(byte[] buffer)
{
for (int i = 0; i < buffer.length; ++i)
{
buffer[i] = _oddParityTable[buffer[i] & 0xFF];
}
}
static byte[] _oddParityTable = {
(byte)1,(byte)1,(byte)2,(byte)2,(byte)4,(byte)4,(byte)7,(byte)7,(byte)8,(byte)8,(byte)11,(byte)11,(byte)13,(byte)13,(byte)14,(byte)14,
(byte)16,(byte)16,(byte)19,(byte)19,(byte)21,(byte)21,(byte)22,(byte)22,(byte)25,(byte)25,(byte)26,(byte)26,(byte)28,(byte)28,(byte)31,(byte)31,
(byte)32,(byte)32,(byte)35,(byte)35,(byte)37,(byte)37,(byte)38,(byte)38,(byte)41,(byte)41,(byte)42,(byte)42,(byte)44,(byte)44,(byte)47,(byte)47,
(byte)49,(byte)49,(byte)50,(byte)50,(byte)52,(byte)52,(byte)55,(byte)55,(byte)56,(byte)56,(byte)59,(byte)59,(byte)61,(byte)61,(byte)62,(byte)62,
(byte)64,(byte)64,(byte)67,(byte)67,(byte)69,(byte)69,(byte)70,(byte)70,(byte)73,(byte)73,(byte)74,(byte)74,(byte)76,(byte)76,(byte)79,(byte)79,
(byte)81,(byte)81,(byte)82,(byte)82,(byte)84,(byte)84,(byte)87,(byte)87,(byte)88,(byte)88,(byte)91,(byte)91,(byte)93,(byte)93,(byte)94,(byte)94,
(byte)97,(byte)(byte)97,(byte)(byte)98,(byte)(byte)98,(byte)100,(byte)100,(byte)103,(byte)103,(byte)104,(byte)104,(byte)107,(byte)107,(byte)109,(byte)109,(byte)110,(byte)110,
(byte)112,(byte)112,(byte)115,(byte)115,(byte)117,(byte)117,(byte)118,(byte)118,(byte)121,(byte)121,(byte)122,(byte)122,(byte)124,(byte)124,(byte)127,(byte)127,
(byte)128,(byte)128,(byte)131,(byte)131,(byte)133,(byte)133,(byte)134,(byte)134,(byte)137,(byte)137,(byte)138,(byte)138,(byte)140,(byte)140,(byte)143,(byte)143,
(byte)145,(byte)145,(byte)146,(byte)146,(byte)148,(byte)148,(byte)151,(byte)151,(byte)152,(byte)152,(byte)155,(byte)155,(byte)157,(byte)157,(byte)158,(byte)158,
(byte)161,(byte)161,(byte)162,(byte)162,(byte)164,(byte)164,(byte)167,(byte)167,(byte)168,(byte)168,(byte)171,(byte)171,(byte)173,(byte)173,(byte)174,(byte)174,
(byte)176,(byte)176,(byte)179,(byte)179,(byte)181,(byte)181,(byte)182,(byte)182,(byte)185,(byte)185,(byte)186,(byte)186,(byte)188,(byte)188,(byte)191,(byte)191,
(byte)193,(byte)193,(byte)194,(byte)194,(byte)196,(byte)196,(byte)199,(byte)199,(byte)200,(byte)200,(byte)203,(byte)203,(byte)205,(byte)205,(byte)206,(byte)206,
(byte)208,(byte)208,(byte)211,(byte)211,(byte)213,(byte)213,(byte)214,(byte)214,(byte)217,(byte)217,(byte)218,(byte)218,(byte)220,(byte)220,(byte)223,(byte)223,
(byte)224,(byte)224,(byte)227,(byte)227,(byte)229,(byte)229,(byte)230,(byte)230,(byte)233,(byte)233,(byte)234,(byte)234,(byte)236,(byte)236,(byte)239,(byte)239,
(byte)241,(byte)241,(byte)242,(byte)242,(byte)244,(byte)244,(byte)247,(byte)247,(byte)248,(byte)248,(byte)251,(byte)251,(byte)253,(byte)253,(byte)254,(byte)254};
}
关于java - 在 Java 中对 DES.EXE 中的文件进行 DES 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923553/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!