【1】SM4 CBC-MAC 机制

0x01 题目

MSG1:
e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2
MAC1:
0712c867aa6ec7c1bb2b66312367b2c8
-----------------------------------------------------
MSG2:
d8d94f33797e1f41cab9217793b2d0f02b93d46c2ead104dce4bfec453767719
MAC2:
43669127ae268092c056fd8d03b38b5b
-----------------------------------------------------
请输入您的MSG3(64字节,128个Hex,不要添加空格!)(Please input your 64bytes MSG3(64 bytes,128 hexs,don't using space)):

0x02分析

        由于 SM4 CBC-MAC 的计算是需要密钥的,而我们没有密钥也就无法计算任意消息的 MAC 值,这里肯定是需要去特殊构造的。然而一开始并没有什么头绪,直到比我熟悉国密的队友提示说 SM4 CBC-MAC 的初始 iv 是全零

       既然没有密钥,那么这题肯定是要用现有的信息了。另外注意到,两个消息都是32字节,却让我们给一个64字节的消息,题目已经推着我们把两个消息合并到一起了。

       两个消息合并,那么最后的 MAC 值就用 MAC2(MAC1其实也行)好了,于是我们就需要处理一下拼接处的问题。

p1 :e55e3e24a3ae7797808fdca05a16ac15

p2 :eb5fa2e6185c23a814a35ba32b4637c2

p3 :d8d94f33797e1f41cab9217793b2d0f0

p4 :2b93d46c2ead104dce4bfec453767719

明文 :p1 || p2  || MAC1 XOR P3 || p4  -------》对应MAC值:MAC2

得到最终的消息:e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2dfcb8754d310d88071924746b0d562382b93d46c2ead104dce4bfec453767719

0x03 答案

请输入您的MSG3(64字节,128个Hex,不要添加空格!)(Please input your 64bytes MSG3(64 bytes,128 hexs,don't using space)):
e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2dfcb8754d310d88071924746b0d562382b93d46c2ead104dce4bfec453767719
请输入您的MAC3(Please input your MAC3):
43669127ae268092c056fd8d03b38b5b
-----------------------------------------------------
**恭喜!谜题答案验证正确!(Congratulations!Puzzle verified correctly!)**
下面是您的战利品,请妥善记录后再关闭程序,(Your Spoils of war is follow,Please copy that before shutdown this program!)**
-----------------------------------------------------
Flag:
flag{N1lC9AuYQaPZo68G4ZSkw9PBgTMRFkkh}

-----------------------------------------------------
Gitea User Name:
TFCTEVTION
-----------------------------------------------------
Gitea Password:
#s@f3ty2024
-----------------------------------------------------
请按回车键结束谜题程序(Please press "Enter" key to end)
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中实现SM4-CBC加密模式,你可以使用Bouncy Castle密码库来实现。以下是一个示例代码: ```java import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.InvalidCipherTextException; import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.modes.CBCBlockCipher; import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithIV; import org.bouncycastle.util.encoders.Hex; import java.nio.charset.StandardCharsets; public class SM4CBCExample { public static void main(String[] args) throws InvalidCipherTextException { // 128-bit密钥(16字节) byte[] key = Hex.decode("0123456789abcdef0123456789abcdef"); // 128-bit初始向量(16字节) byte[] iv = Hex.decode("0123456789abcdef0123456789abcdef"); // 明文 String plaintext = "Hello, SM4 CBC!"; byte[] plaintextBytes = plaintext.getBytes(StandardCharsets.UTF_8); // 加密 byte[] ciphertext = sm4CBC(key, iv, true, plaintextBytes); System.out.println("Ciphertext: " + Hex.toHexString(ciphertext)); // 解密 byte[] decryptedBytes = sm4CBC(key, iv, false, ciphertext); String decryptedText = new String(decryptedBytes, StandardCharsets.UTF_8); System.out.println("Decrypted Text: " + decryptedText); } private static byte[] sm4CBC(byte[] key, byte[] iv, boolean encrypt, byte[] data) throws InvalidCipherTextException { SM4Engine sm4Engine = new SM4Engine(); CBCBlockCipher cbcBlockCipher = new CBCBlockCipher(sm4Engine); PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(cbcBlockCipher); CipherParameters params = new ParametersWithIV(new KeyParameter(key), iv); cipher.init(encrypt, params); byte[] output = new byte[cipher.getOutputSize(data.length)]; int processedBytes = cipher.processBytes(data, 0, data.length, output, 0); processedBytes += cipher.doFinal(output, processedBytes); byte[] result = new byte[processedBytes]; System.arraycopy(output, 0, result, 0, processedBytes); return result; } } ``` 这个示例使用Bouncy Castle库进行SM4-CBC算法的加密和解密操作。你需要将Bouncy Castle库添加到项目的依赖中。在示例中,我们使用了一个128-bit的密钥和初始向量(IV),明文为"Hello, SM4 CBC!"。加密后的密文以十六进制形式打印出来,并通过解密操作验证解密结果。 请注意,本示例仅供参考,实际应用中可能需要根据具体需求进行适当的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值