huangye-parking/server/tests/HuangyanParking.Tests/YglCryptoPropertyTests.cs
2026-02-28 17:35:49 +08:00

73 lines
2.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Security.Cryptography;
using FsCheck;
using FsCheck.Xunit;
using HuangyanParking.Infrastructure.Services;
namespace HuangyanParking.Tests;
/// <summary>
/// 驿公里加解密和签名的属性测试
/// </summary>
public class YglCryptoPropertyTests
{
private readonly YglCrypto _crypto = new();
// DES密钥必须是8字节Base64编码后用于测试
private static readonly string TestDesKey = Convert.ToBase64String(
[0x9B, 0xCE, 0x86, 0x3D, 0x92, 0x61, 0x0E, 0x62]); // "ns6GPZJhDmI="
// 生成RSA密钥对用于测试
private static readonly (string PrivateKey, string PublicKey) TestRsaKeys = GenerateRsaKeyPair();
private static (string PrivateKey, string PublicKey) GenerateRsaKeyPair()
{
using var rsa = RSA.Create(2048);
var privateKey = Convert.ToBase64String(rsa.ExportPkcs8PrivateKey());
var publicKey = Convert.ToBase64String(rsa.ExportSubjectPublicKeyInfo());
return (privateKey, publicKey);
}
/// <summary>
/// Feature: huangyan-parking-points, Property 6: 驿公里数据加解密 Round-Trip
/// 对于任意有效JSON数据DES加密后解密应得到原始数据
/// Validates: Requirements 15.4
/// </summary>
[Property(MaxTest = 100)]
public bool YglDesEncryptDecrypt_RoundTrip_ShouldReturnOriginalData(NonEmptyString input)
{
var plainText = input.Get;
var encrypted = _crypto.EncryptDes(plainText, TestDesKey);
var decrypted = _crypto.DecryptDes(encrypted, TestDesKey);
return decrypted == plainText;
}
/// <summary>
/// Feature: huangyan-parking-points, Property 6补充: RSA签名后验签应通过
/// Validates: Requirements 15.4
/// </summary>
[Property(MaxTest = 100)]
public bool YglRsaSignVerify_ShouldPass(NonEmptyString input)
{
var data = input.Get;
var signature = _crypto.SignRsa(data, TestRsaKeys.PrivateKey);
return _crypto.VerifyRsa(data, TestRsaKeys.PublicKey, signature);
}
/// <summary>
/// Feature: huangyan-parking-points, Property 6补充: 篡改数据后RSA验签应失败
/// Validates: Requirements 15.4
/// </summary>
[Property(MaxTest = 100)]
public bool YglRsaSignVerify_TamperedData_ShouldFail(NonEmptyString input)
{
var data = input.Get;
var signature = _crypto.SignRsa(data, TestRsaKeys.PrivateKey);
var tampered = data + "_tampered";
return !_crypto.VerifyRsa(tampered, TestRsaKeys.PublicKey, signature);
}
}