在关于分组密码模式的维基百科文章中,他们有一个简洁的未加密图像的小图,使用ECB模式加密的相同图像和使用其他方法加密的同一图像的另一个版本.
在大学里,我开发了自己的DES实现(你可以在这里找到),我们必须在演示中演示我们的实现.
我想使用我们的实现显示如上所示的类似示例.但是,大多数图像文件都有与之关联的标题块,在使用我们的实现加密文件时,也会加密.因此,当您在图像查看器中打开它们时,它们会被假定为已损坏且无法查看.
我想知道是否有新的简单的无标题图像格式,我们可以使用它来显示这些?或者,如果有人对上面图像的原始创建者如何达到上述结果有任何想法?
任何帮助,将不胜感激,
谢谢
注意:我意识到滚动你自己的加密库是愚蠢的,并且DES被认为是破坏的,并且ECB模式对于任何有用的加密都是非常有缺陷的,这纯粹是学校的学术练习.所以,请不要讲课,我知道演习.
请注意,我在这里遇到的问题是密钥大小.首先,基于下面代码中包含的注释,我认为我的密钥需要是24字节(192位).这不起作用所以我给了16,32和8字节键一个镜头 - 似乎没有任何工作."不工作"是指在我的文本加密和解密后,它与原始文本的值不同.
原文: 'Example test this should work '
加密文字: ¸¹pÕô6
解密文字: 'Example '
以下是我正在使用的两个功能(加密/解密功能).此外,我将包括我如何调用每个函数.
// 168-bit (three-key) 3DES (Triple-DES) encrypt a single 8-byte block (ECB mode)
// plain-text should be 8-bytes, key should be 24 bytes.
public byte[] TripleDesEncryptOneBlock(byte[] plainText, byte[] key)
{
// Create a new 3DES key.
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
// Set the KeySize = 192 for 168-bit DES encryption.
// The msb of each byte is a parity bit, …
Run Code Online (Sandbox Code Playgroud) 简单问题:我构建了一个准处理器模拟器,它采用优先级图形,确定优先级(和"就绪"指令),在可用功能单元上安排任务等.几乎是一个非常基本的模拟器.
但我意识到我应该在DES引擎之上构建它,因为我没有容量(除了设置标志并检查每个"时钟滴答"上的每个节点),因为它说"在10个循环中,执行此操作"(即在预定时间提升信号并处理将来应该发生的事件或者当满足预定标准时的事件.
我显然可以自己实现这个; 建立了一个"事件"类,把它们粘在一个队列,并在年底每个周期(或开始),检查队列,看看有什么在那里,但我想有一个在重新发明轮子是没有意义的.
因此,复杂的网络模拟器显然是过度杀伤.我不需要花哨的建模,排队等等.我需要的只是一个内置时钟,能够设置事件发生,在事情发生时引发标志等,如上所述.
免费软件和C++会很棒.
有人有主意吗?(我最接近的 - 感谢其他一些相关的问题 - 就是所谓的SIMLIB.)
非常感谢!
我目前正在玩一本名为Violent Python的例子.你可以在这里看到我的实现
我现在正在尝试在Go中实现相同的脚本以比较性能,请注意我对Go来说是全新的.打开文件并遍历这些行很好,但是我无法弄清楚如何使用"加密"库以与Python的crypt.crypt(str_to_hash,salt)相同的方式对字符串进行散列.我觉得它可能就像
import "crypto/des"
des.NewCipher([]byte("abcdefgh"))
Run Code Online (Sandbox Code Playgroud)
但是,没有雪茄.任何帮助都会非常感激,因为将Go的并行性能与Python的多线程性能进行比较会非常有趣.
我几乎用C语言实现了DES算法,我想优化我的代码.所以我用过gprof
.以下是报告的一部分:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
51.78 9.32 9.32 8000000 1.17 1.17 sboxes
34.71 15.57 6.25 8000000 0.78 0.78 extendRight
9.90 17.35 1.78 500000 3.56 35.96 operation
2.39 17.78 0.43 8000000 0.05 0.05 xorRightAndKey
Run Code Online (Sandbox Code Playgroud)
gprof
表明该sboxes
功能占51.78%的时间.
在sboxes(uchar aucData[6], ...)
,我被给予48位,将它们分成8个插槽,每个插槽为6位.
每个插槽:
将第一位与最后一位组合得到X
;
获得中间4位得到Y
;
做的东西(X, Y)
;
例如,011110
是一个插槽,所以X = 00
和Y = …
偶尔,我会遇到一个有趣的,奇怪的事情:使用几个不同的密钥可以解密相同的加密文本块!
谁能告诉我出了什么问题?非常感谢.
请不要试图让我切换到三重DES/AES等,我只是想知道问题出在哪里 - 调用Java SDK的方式,还是Java SDK中的错误?
以下是Windows 7上的输出,在Linux框中的结果相同:
D:\>java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
D:\>java DESTest -e 12345678 abcde977
encrypted as [17fd146fa6fdbb5db667efe657dfcb60]
D:\>java DESTest -d 17fd146fa6fdbb5db667efe657dfcb60 abcde977
decryted as [12345678]
D:\>java DESTest -d 17fd146fa6fdbb5db667efe657dfcb60 abcde976
decryted as [12345678]
D:\>java DESTest -d 17fd146fa6fdbb5db667efe657dfcb60 abcde967
decryted as [12345678]
D:\>java DESTest -d 17fd146fa6fdbb5db667efe657dfcb60 abcde867
decryted as [12345678]
D:\>java DESTest -d 17fd146fa6fdbb5db667efe657dfcb60 abcdf867
Exception in thread "main" java.lang.RuntimeException: javax.crypto.BadPaddingEx …
Run Code Online (Sandbox Code Playgroud) 我在理解密码学中的密钥长度要求方面遇到了一些困难.我目前正在使用DES,我认为它是56位...现在,通过将8个字符的密码转换为byte[]
我的加密工作.如果我使用7位数密码,则不会.
现在,请原谅我,如果我错了,但是因为ASCII字符是7位,因此8*7 = 56位?
这对我来说似乎不对.如果我想使用密钥,为什么我不能只传入我的密钥的盐渍哈希,即MD5哈希?
我确信这很简单,但我无法清楚地了解正在发生的事情.
我有一个使用 DES 的工作代码示例(见下文),但我想指定要使用的关键数据。如何编辑代码示例来执行此操作?
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
public class DESEncryptionDecryption {
private static Cipher encryptCipher;
private static Cipher decryptCipher;
public static void main(String[] args) {
try {
KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
SecretKey secretKey = keygenerator.generateKey();
encryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = encryptData("Classified Information!");
decryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, secretKey);
decryptData(encryptedData);
}}}
Run Code Online (Sandbox Code Playgroud) 为什么此代码会返回弱键错误?
static public byte[] TDESDecrypt(byte[] toDecrypt, byte[] key, CipherMode mode = CipherMode.ECB, PaddingMode padding = PaddingMode.None)
{
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.Mode = mode;
tdes.Padding = padding;
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);
tdes.Clear();
return resultArray;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试执行“tdes.Key = key”行时,出现错误
deriveSessionKeyIS System.Security.Cryptography.CryptographyException:指定的密钥是 TripleDES 的已知弱密钥,无法使用
为什么?我尝试的密钥是随机的,但测试的密钥之一是FB13347FE570DC4FFB13347FE570DC4F。哪里有问题?
目前试图弄清楚为什么我的解密方法不起作用。我使用 DES、CBC 和 PKCS7Padding 来加密我的字符串。我当前的代码panic: crypto/cipher: input not full blocks
在解密期间输出。