diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/ULID.java b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/ULID.java
index 5dfccd6bd..845978de1 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/data/id/ULID.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/data/id/ULID.java
@@ -24,6 +24,18 @@ import java.util.Objects;
import java.util.Random;
/**
+ * ULID(Universally Unique Lexicographically Sortable Identifier)通用唯一词典分类标识符,特性:
+ *
+ * - 与UUID的128位兼容性
+ * - 每毫秒1.21e + 24个唯一ULID
+ * - 按字典顺序(也就是字母顺序)排序
+ * - 规范地编码为26个字符串,而不是UUID的36个字符
+ * - 使用Crockford的base32获得更好的效率和可读性(每个字符5位)
+ * - 不区分大小写
+ * - 没有特殊字符(URL安全)
+ * - 单调排序顺序(正确检测并处理相同的毫秒)
+ *
+ *
* 参考:https://github.com/zjcscut/framework-mesh/blob/master/ulid4j/src/main/java/cn/vlts/ulid/ULID.java
* {@code
* 01AN4Z07BY 79KA1307SR9X4MV3
@@ -32,7 +44,7 @@ import java.util.Random;
* 48bits 80bits
* }
*
- * @author throwable
+ * @author throwable,Looly
* @since 6.0.0
*/
public class ULID implements Comparable, Serializable {
diff --git a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/IssueI99FKETest.java b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/IssueI99FKETest.java
new file mode 100644
index 000000000..2f3ce88ab
--- /dev/null
+++ b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/IssueI99FKETest.java
@@ -0,0 +1,27 @@
+package org.dromara.hutool.crypto;
+
+import org.bouncycastle.jce.interfaces.ECPrivateKey;
+import org.bouncycastle.jce.interfaces.ECPublicKey;
+import org.bouncycastle.math.ec.ECPoint;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigInteger;
+import java.security.KeyPair;
+
+public class IssueI99FKETest {
+ @Test
+ void getSm2KeyTest() {
+ final KeyPair pair = KeyUtil.generateKeyPair("SM2");
+ final ECPrivateKey aPrivate = (ECPrivateKey) pair.getPrivate();
+ final BigInteger d = aPrivate.getD();
+ Assertions.assertNotNull(d);
+
+ final ECPublicKey aPublic = (ECPublicKey) pair.getPublic();
+ final ECPoint point = aPublic.getQ();
+ final BigInteger x = point.getXCoord().toBigInteger();
+ final BigInteger y = point.getYCoord().toBigInteger();
+ Assertions.assertNotNull(x);
+ Assertions.assertNotNull(y);
+ }
+}