package org.yy.mac;
import org.bouncycastle.crypto.Mac;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
/**
* @author YaoYuan
* @since 2022/11/2
*/
public class YMacTest {
private static void showMsg() {
System.out.println();
}
private static void showMsg(String msg) {
System.out.println(msg);
}
private static void showData(byte[] data) {
for (int i = 0; i < data.length; i++) {
if ((i) % 8 == 0)
System.out.printf("D%d | ", i / 8 + 1);
System.out.printf("%02X ", data[i]);
if ((i + 1) % 8 == 0)
System.out.println();
}
System.out.println();
}
private static void showMac(byte[] mac) {
System.out.print("MAC= ");
for (int i = 0; i < mac.length; i++)
System.out.printf("%02X ", mac[i]);
System.out.println();
}
void showDataAndPadding(byte[] data, int blockSize) {
byte[] msg1Padding1 = YCMac.padding1(data, blockSize);
showMsg("填充方式1:");
showData(msg1Padding1);
byte[] msg1Padding2 = YCMac.padding2(data, blockSize);
showMsg("填充方式2:");
showData(msg1Padding2);
byte[] msg1Padding3 = YCMac.padding3(data, blockSize);
showMsg("填充方式3:");
showData(msg1Padding3);
showMsg();
}
/**
* OMAC测试,包括AES128/192/256和DESede。
* <p>
* 测试数据取自于NIST文档"SP800-38B"。但其中关于DES的数据有两处和测试结果不一致。
*/
@Test
public void test_omac1() throws YCryptoException {
showMsg("omac SP800-38B verify: ");
for (TestData2 testData : testDatas2) {
showMsg("====================================================================");
showMsg("algorithm : " + testData.algSymm.name());
showMsg("key: " + Hex.toHexString(testData.key));
showMsg("msg: " + Hex.toHexString(testData.msg));
byte[] cmac = YCMac.omac(testData.algSymm, testData.key, testData.msg);
showMsg("mac: " + Hex.toHexString(cmac));
Assert.assertArrayEquals(testData.mac, cmac);
}
}
/**
* CMAC/OMAC 测试。
*/
@Test
public void test_omac2() throws YCryptoException {
RandomGenerator randomGenerator = new RandomGenerator();
int length = 171;
byte[] data = randomGenerator.nextBytes(length);
byte[] keySrc = randomGenerator.nextBytes(32);
showMsg("omac test: ");
showMsg("data: " + Hex.toHexString(data));
for (AlgSymm algSymm : AlgSymm.values()) {
showMsg("====================================================================");
byte[] key = Arrays.copyOfRange(keySrc, 0, SymmUtils.getSymmKeyLength(algSymm));
showMsg("algorithm : " + algSymm.name());
showMsg("key: " + Hex.toHexString(key));
showMsg("--------------------------------------------------------------------");
byte[] cmac = YCMac.omac(algSymm, key, data);
showMsg("omac: " + Hex.toHexString(cmac));
}
}
/**
* 《GBT 15852.1》-附录 测试验证。
*/
@Test
public void test_cmac1() {
int blockSize = 8;
showMsg("CMAC测试: 《GBT 15852.1-2008 信息技术 安全技术 消息鉴别码 第1部分:采用分组密码的机制》-附录A");
showMsg();
showMsg("消息1:" + msg1);
showMsg("Hex: " + Hex.toHexString(msg1.getBytes()));
showDataAndPadding(msg1.getBytes(), blockSize);
showMsg("消息2:" + msg2);
showMsg("hex: " + Hex.toHexString(msg2.getBytes()));
showDataAndPadding(msg2.getBytes(), blockSize);
showMsg("mac算法测试:");
testGBT15852_1();
}
void testGBT15852_1() {
for (TestData testData : testDatas) {
showMsg("--------------------------------------------------");
showMsg("消息: " + Hex.toHexString(testData.msg));
showMsg("MAC算法" + testData.typeAlg + ": ");
showMsg("填充方法" + testData.typePad + ": ");
int macSize = testData.mac.length;
Mac mac;
if (testData.typeAlg == 5 || testData.typeAlg == 6)
mac = new CMac56(YCMac.getBlockCipher(testData.algSymm), YCMac.getBlockCipher(testData.algSymm), macSize * 8);
else
mac = new CMac14(YCMac.getBlockCipher(testData.algSymm), macSize * 8);
ParametersWithPadding parameters = new ParametersWithPadding(
testData.key1, testData.key2, testData.typeAlg, testData.typePad, testData.msg.length
);
byte[] macValue = new byte[macSize];
mac.init(parameters);
mac.update(testData.msg, 0, testData.msg.length);
mac.doFinal(macValue, 0);
showMac(macValue);
showMsg();
Assert.assertArrayEquals(testData.mac, macValue);
}
}
/**
* CMAC-update 测试。
* <p>
* 使用《GBT 15852.1》的算法1和填充1进行CMAC的update模式测试。
*/
@Test
public void test_cmac_update() {
RandomGenerator randomGenerator = new RandomGenerator();
int length = 171;
byte[] data = randomGenerator.nextBytes(length);
byte[] keySrc = randomGenerator.nextBytes(32);
showMsg("cmac_update test: ");
for (AlgSymm algSymm : AlgSymm.values()) {
showMsg("====================================================================");
byte[] key = Arrays.copyOfRange(keySrc, 0, SymmUtils.getSymmKeyLength(algSymm));
byte[] iv = Arrays.copyOfRange(keySrc, 0, SymmUtils.getSymmBlockLength(algSymm));
showMsg("algorithm : " + algSymm.name());
showMsg("data: " + Hex.toHexString(data));
showMsg("key: " + Hex.toHexString(key));
showMsg("iv: " + Hex.toHexString(iv));
showMsg("--------------------------------------------------------------------");
byte[] iv0 = iv.clone();
byte[] mac = YCMac.cmac(algSymm, key, iv0, data);
showMsg("cmac: " + Hex.toHexString(mac));
int blockSize = SymmUtils.getSymmBlockLength(algSymm);
iv0 = iv.clone();
int times = length / blockSize;
int remain = length % blockSize;
byte[] cmac = new byte[0];
for (int i = 0; i < times; i++) {
cmac = Arrays.copyOfRange(data, i * blockSize, i * blockSize + blockSize);
cmac = YCMac.cmac(algSymm, key, iv0, cmac);
}
if (remain > 0) {
cmac = Arrays.copyOfRange(data, times * blockSize, data.length);
cmac = YCMac.cmac(algSymm, key, iv0, cmac);
}
showMsg("cmac: " + Hex.toHexString(cmac));
Assert.assertArrayEquals(mac, cmac);
}
}
/**
* XX中心提供的测试数据,CMAC,SM4,IV
* <p>
* 使用《GBT 15852.1》的算法1和填充1进行CMAC
*/
@Test
public void test_cmac2() {
showMsg("cmac XX中心测试数据验证: ");
for (TestData3 testData : testdatas3) {
AlgSymm algSymm = AlgSymm.SM4;
showMsg("--------------------------------------------------------------------");
showMsg("algorithm : " + algSymm.name());
showMsg("key: " + Hex.toHexString(testData.key));
if (testData.iv != null)
showMsg("iv: " + Hex.toHexString(testData.iv));
showMsg("mac:
CMAC/OMAC1的java实现、验证和测试
需积分: 39 11 浏览量
2022-11-04
14:32:00
上传
评论
收藏 18KB RAR 举报
元子丰
- 粉丝: 233
- 资源: 18
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈