java判斷對稱素數_SM2非對稱算法的原理及實現 Java SM2的代碼案例 | 一生孤注擲溫柔 | 小奮斗...

SM2橢圓曲線公鑰密碼算法:我國自主知識產權的商用密碼算法,是ECC(Elliptic Curve Cryptosystem)算法的一種,基于橢圓曲線離散對數問題,計算復雜度是指數級,求解難度較大,同等安全程度要求下,橢圓曲線密碼較其他公鑰算法所需密鑰長度小很多。

ECC算法描述:

1、用戶A選定一條適合加密的橢圓曲線Ep(a,b)(如:y2=x3+ax+b),并取橢圓曲線上一點,作為基點G。

2、用戶A選擇一個私有密鑰k,并生成公開密鑰(公鑰PB)K=kG。

3、用戶A將Ep(a,b)和點(公鑰)K,G傳給用戶B。

4、用戶B接到信息后 ,將待傳輸的明文(M)編碼到Ep(a,b)上一點M,并產生一個隨機整數r(r

5、用戶B計算點C1=M+rK;C2=rG。

6、用戶B將C1、C2傳給用戶A。

7、用戶A接到信息后,計算C1-kC2,結果就是點M。因為C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M

再對點M進行解碼就可以得到明文。

密碼學中,描述一條Fp上的橢圓曲線,常用到六個參量:

T=(p,a,b,G,n,h)。

(p 、a 、b 用來確定一條橢圓曲線,G為基點,n為點G的階,h 是橢圓曲線上所有點的個數m與n相除的整數部分)

這幾個參量取值的選擇,直接影響了加密的安全性。參量值一般要求滿足以下幾個條件:

1、p 當然越大越安全,但越大,計算速度會變慢,200位左右可以滿足一般安全要求;

2、p≠n×h;

3、pt≠1 (mod n),1≤t<20;

4、4a3+27b2≠0 (mod p);

5、n 為素數;

6、h≤4。

輕量級密碼術包(BouncyCastle):

一種用于 Java 平臺的開放源碼的輕量級密碼術包;它支持大量的密碼術算法,并提供JCE 1.2.1的實現。

bcprov-ext-jdk15on-160.jar

This release adds support for SHA-3 signatures to CMS, support for the Unified Model of Diffie-Hellman, and a parser for the GNU keybox format. PGP EC operations now support a wider range of curves, the BCJSSE now supports SNI, support has been added for generating ECGOST key transport messages and key wrapping ciphers can now also be used for wrapping general data. Initial low-level support has also been added for EdDSA. In terms of bugs fixed: RSA key pair generation with adjusted certainty values now conforms fully with FIPS PUB 186-4, the CRMF EncryptedValue field now encodes the encrypted value correctly without including the wrapping structure from the encryption, XMSS now validates any private key BDS data before construction, the SM2 signature now fully resets on a sign() call, and PGP secret keys with a null encryptor now calculate the correct checksum. An off by one error in the EST JsseDefaultHostnameAuthorizer valid name matcher has also been fixed. Further details on other additions and bug fixes can be found in the release notes file accompanying the release.

pom.xml

1

2

3

4

5

org.bouncycastle

bcprov-jdk15on

1.60

代碼案例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28package?com.what21.demo.bouncycastle;

import?java.math.BigInteger;

import?org.bouncycastle.math.ec.ECPoint;

public?class?SM2KeyPair?{

/**?公鑰?*/

private??ECPoint?publicKey;

/**?私鑰?*/

private?BigInteger?privateKey;

SM2KeyPair(ECPoint?publicKey,?BigInteger?privateKey)?{

this.publicKey?=?publicKey;

this.privateKey?=?privateKey;

}

public?ECPoint?getPublicKey()?{

return?publicKey;

}

public?BigInteger?getPrivateKey()?{

return?privateKey;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278package?com.what21.demo.bouncycastle;

import?java.math.BigInteger;

import?java.security.SecureRandom;

import?java.util.Arrays;

import?org.bouncycastle.crypto.DerivationFunction;

import?org.bouncycastle.crypto.digests.SHA256Digest;

import?org.bouncycastle.crypto.digests.ShortenedDigest;

import?org.bouncycastle.crypto.generators.KDF1BytesGenerator;

import?org.bouncycastle.crypto.params.ISO18033KDFParameters;

import?org.bouncycastle.math.ec.ECCurve;

import?org.bouncycastle.math.ec.ECPoint;

public?class?SM2Utils?{

/**?素數p?*/

private?static?final?BigInteger?p?=new?BigInteger("FFFFFFFE"?+"FFFFFFFF"

+"FFFFFFFF"?+"FFFFFFFF"?+"FFFFFFFF"?+"00000000"?+"FFFFFFFF"

+"FFFFFFFF",16);

/**?系數a?*/

private?static?final?BigInteger?a?=new?BigInteger("FFFFFFFE"?+"FFFFFFFF"

+"FFFFFFFF"?+"FFFFFFFF"?+"FFFFFFFF"?+"00000000"?+"FFFFFFFF"

+"FFFFFFFC",16);

/**?系數b?*/

private?static?final?BigInteger?b?=new?BigInteger("28E9FA9E"?+"9D9F5E34"

+"4D5A9E4B"?+"CF6509A7"?+"F39789F5"?+"15AB8F92"?+"DDBCBD41"

+"4D940E93",16);

/**?坐標x?*/

private?static?final?BigInteger?xg?=new?BigInteger("32C4AE2C"?+"1F198119"

+"5F990446"?+"6A39C994"?+"8FE30BBF"?+"F2660BE1"?+"715A4589"

+"334C74C7",16);

/**?坐標y?*/

private?static?final?BigInteger?yg?=new?BigInteger("BC3736A2"?+"F4F6779C"

+"59BDCEE3"?+"6B692153"?+"D0A9877C"?+"C62A4740"?+"02DF32E5"

+"2139F0A0",16);

/**?基點G,?G=(xg,yg),其介記為n?*/

private?static?final?BigInteger?n?=new?BigInteger("FFFFFFFE"?+"FFFFFFFF"

+"FFFFFFFF"?+"FFFFFFFF"?+"7203DF6B"?+"21C6052B"?+"53BBF409"

+"39D54123",16);

private?static?SecureRandom?random?=new?SecureRandom();

private?ECCurve.Fp?curve;

private?ECPoint?G;

@SuppressWarnings("deprecation")

public?SM2Utils()?{

curve?=new?ECCurve.Fp(p,//?q

a,//?a

b);//?b

G?=?curve.createPoint(xg,?yg);

}

public?static?String?printHexString(byte[]?b)?{

StringBuilder?builder?=new?StringBuilder();

for?(int?i?=0;?i?

String?hex?=?Integer.toHexString(b[i]?&0xFF);

if?(hex.length()?==1)?{

builder.append('0'+hex);

hex?='0'?+?hex;

}

//System.out.print(hex.toUpperCase());

//System.out.print(hex.toUpperCase());

builder.append(hex);

}

//System.out.println();

return?builder.toString();

}

public?BigInteger?random(BigInteger?max)?{

BigInteger?r?=new?BigInteger(256,?random);

//?int?count?=?1;

while?(r.compareTo(max)?>=0)?{

r?=new?BigInteger(128,?random);

//?count++;

}

//?System.out.println("count:?"?+?count);

return?r;

}

private?boolean?allZero(byte[]?buffer)?{

for?(int?i?=0;?i?

if?(buffer[i]?!=0)

return?false;

}

return?true;

}

/**

*?加密

*?@param?input?待加密消息M

*?@param?publicKey?公鑰

*?@return?byte[]?加密后的字節數組

*/

public?byte[]?encrypt(String?input,?ECPoint?publicKey)?{

//System.out.println("publicKey?is:?"+publicKey);

byte[]?inputBuffer?=?input.getBytes();

//printHexString(inputBuffer);

/*?1?產生隨機數k,k屬于[1,?n-1]?*/

BigInteger?k?=?random(n);

//System.out.print("k:?");

printHexString(k.toByteArray());

/*?2?計算橢圓曲線點C1?=?[k]G?=?(x1,?y1)?*/

ECPoint?C1?=?G.multiply(k);

byte[]?C1Buffer?=?C1.getEncoded(false);

//System.out.print("C1:?");

printHexString(C1Buffer);

//?3?計算橢圓曲線點?S?=?[h]Pb?*?curve沒有指定余因子,h為空

//????????? ?BigInteger?h?=?curve.getCofactor();?System.out.print("h:?");

//????????? ?printHexString(h.toByteArray());?if?(publicKey?!=?null)?{?ECPoint

//????????? ?result?=?publicKey.multiply(h);?if?(!result.isInfinity())?{

//????????? ?System.out.println("pass");?}?else?{

//????????? System.err.println("計算橢圓曲線點?S?=?[h]Pb失敗");?return?null;?}?}

/*?4?計算?[k]PB?=?(x2,?y2)?*/

ECPoint?kpb?=?publicKey.multiply(k).normalize();

/*?5?計算?t?=?KDF(x2||y2,?klen)?*/

byte[]?kpbBytes?=?kpb.getEncoded(false);

DerivationFunction?kdf?=?new?KDF1BytesGenerator(new?ShortenedDigest(

new?SHA256Digest(),?20));

byte[]?t?=?new?byte[inputBuffer.length];

kdf.init(new?ISO18033KDFParameters(kpbBytes));

kdf.generateBytes(t,?0,?t.length);

if?(allZero(t))?{

//System.err.println("all?zero");

}

/*?6?計算C2=M^t?*/

byte[]?C2?=?new?byte[inputBuffer.length];

for?(int?i?=?0;?i?

C2[i]?=?(byte)?(inputBuffer[i]?^?t[i]);

}

/*?7?計算C3?=?Hash(x2?||?M?||?y2)?*/

byte[]?C3?=?calculateHash(kpb.getXCoord().toBigInteger(),?inputBuffer,

kpb.getYCoord().toBigInteger());

/*?8?輸出密文?C=C1?||?C2?||?C3?*/

byte[]?encryptResult?=?new?byte[C1Buffer.length?+?C2.length?+?C3.length];

System.arraycopy(C1Buffer,?0,?encryptResult,?0,?C1Buffer.length);

System.arraycopy(C2,?0,?encryptResult,?C1Buffer.length,?C2.length);

System.arraycopy(C3,?0,?encryptResult,?C1Buffer.length?+?C2.length,

C3.length);

//System.out.print("密文:?");

//?printHexString(encryptResult);

return?encryptResult;

}

public?byte[]?decrypt(byte[]?encryptData,?BigInteger?privateKey)?{

//System.out.println("privateKey?is:?"+privateKey);

//System.out.println("encryptData?length:?"?+?encryptData.length);

byte[]?C1Byte?=?new?byte[65];

System.arraycopy(encryptData,?0,?C1Byte,?0,?C1Byte.length);

ECPoint?C1?=?curve.decodePoint(C1Byte).normalize();

/*?計算[dB]C1?=?(x2,?y2)?*/

ECPoint?dBC1?=?C1.multiply(privateKey).normalize();

/*?計算t?=?KDF(x2?||?y2,?klen)?*/

byte[]?dBC1Bytes?=?dBC1.getEncoded(false);

DerivationFunction?kdf?=?new?KDF1BytesGenerator(new?ShortenedDigest(

new?SHA256Digest(),?20));

int?klen?=?encryptData.length?-?65?-?20;

//System.out.println("klen?=?"?+?klen);

byte[]?t?=?new?byte[klen];

kdf.init(new?ISO18033KDFParameters(dBC1Bytes));

kdf.generateBytes(t,?0,?t.length);

if?(allZero(t))?{

//System.err.println("all?zero");

}

/*?5?計算M'=C2^t?*/

byte[]?M?=?new?byte[klen];

for?(int?i?=?0;?i?

M[i]?=?(byte)?(encryptData[C1Byte.length?+?i]?^?t[i]);

}

/*?6?計算?u?=?Hash(x2?||?M'?||?y2)?判斷?u?==?C3是否成立?*/

byte[]?C3?=?new?byte[20];

System.arraycopy(encryptData,?encryptData.length?-?20,?C3,?0,?20);

byte[]?u?=?calculateHash(dBC1.getXCoord().toBigInteger(),?M,?dBC1.getYCoord().toBigInteger());

if?(Arrays.equals(u,?C3))?{

//System.out.println("解密成功");

//System.out.println("M'?=?"?+?new?String(M));

return?M;

}?else?{

//System.out.print("u?=?");

//printHexString(u);

//System.out.print("C3?=?");

//printHexString(C3);

//System.err.println("解密驗證失敗");

}

return?null;

}

private?byte[]?calculateHash(BigInteger?x2,?byte[]?M,?BigInteger?y2)?{

ShortenedDigest?digest?=?new?ShortenedDigest(new?SHA256Digest(),?20);

byte[]?buf?=?x2.toByteArray();

digest.update(buf,?0,?buf.length);

digest.update(M,?0,?M.length);

buf?=?y2.toByteArray();

digest.update(buf,?0,?buf.length);

buf?=?new?byte[20];

digest.doFinal(buf,?0);

return?buf;

}

private?boolean?between(BigInteger?param,?BigInteger?min,?BigInteger?max)?{

if?(param.compareTo(min)?>=?0?&&?param.compareTo(max)?

return?true;

}?else?{

return?false;

}

}

/**

*?公鑰校驗

*?@param?publicKey?公鑰

*?@return?boolean?true或false

*/

private?boolean?checkPublicKey(ECPoint?publicKey)?{

if?(!publicKey.isInfinity())?{

BigInteger?x?=?publicKey.getXCoord().toBigInteger();

BigInteger?y?=?publicKey.getYCoord().toBigInteger();

if?(between(x,?new?BigInteger("0"),?p)?&&?between(y,?new?BigInteger("0"),?p))?{

BigInteger?xResult?=?x.pow(3).add(a.multiply(x)).add(b).mod(p);

//System.out.println("xResult:?"?+?xResult.toString());

BigInteger?yResult?=?y.pow(2).mod(p);

//System.out.println("yResult:?"?+?yResult.toString());

if?(yResult.equals(xResult)?&&?publicKey.multiply(n).isInfinity())?{

return?true;

}

}

return?false;

}?else?{

return?false;

}

}

/**

*?獲得公私鑰對

*?@return

*/

public?SM2KeyPair?generateKeyPair()?{

BigInteger?d?=?random(n.subtract(new?BigInteger("1")));

SM2KeyPair?keyPair?=new?SM2KeyPair(G.multiply(d).normalize(),?d);

if?(checkPublicKey(keyPair.getPublicKey()))?{

//System.out.println("generate?key?successfully");

return?keyPair;

}else?{

//System.err.println("generate?key?failed");

return?null;

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21package?com.what21.demo.bouncycastle;

import?java.util.Arrays;

public?class?App?{

/**

*?@param?args

*/

public?static?void?main(String[]?args)?{

SM2Utils?sm2?=new?SM2Utils();

SM2KeyPair?keyPair?=?sm2.generateKeyPair();

String?text?="小奮斗{www.what21.com}";

System.out.println("文本為:"?+?text);

byte[]?data?=?sm2.encrypt(text,keyPair.getPublicKey());

System.out.println("加密為:"+Arrays.toString(data));

byte[]?data2?=?sm2.decrypt(data,?keyPair.getPrivateKey());

System.out.println("解密為:"?+new?String(data2));

}

}

程序輸入:

1

2

3文本為:小奮斗{www.what21.com}

加密為:[4,?66,?87,?4,?-112,?-103,?73,?-79,?-26,?-2,?50,?110,?-45,?119,?-63,?-94,?70,?-24,?111,?93,?79,?47,?2,?92,?-118,?-65,?-87,?-20,?12,?43,?-121,?20,?-39,?-35,?-27,?4,?20,?103,?26,?89,?48,?-95,?-64,?-6,?93,?-35,?69,?63,?-64,?-119,?-14,?65,?11,?24,?43,?-119,?50,?89,?60,?15,?61,?83,?33,?-90,?5,?-44,?-107,?-118,?98,?0,?-12,?10,?0,?-73,?41,?-91,?69,?106,?100,?109,?117,?99,?31,?97,?127,?-120,?64,?-76,?52,?98,?-52,?-79,?96,?19,?-71,?-100,?-111,?-93,?113,?45,?92,?105,?46,?124,?-19,?-66,?-102,?106,?2,?75]

解密為:小奮斗{www.what21.com}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532009.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532009.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532009.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

multipartfile 獲取音頻時長_抖音音頻下載捷徑:一鍵提取音頻,安卓+ios全通用,完全免費...

本文相關&#xff1a;抖音音頻提取、抖音音頻快捷指令、捷徑怎么獲取抖音音樂…昨天有抖友分享了一個抖音短視頻鏈接&#xff0c;告訴我&#xff0c;她很喜歡這個視頻里的歌曲&#xff0c;但是在很多歌曲app上面卻找不到相同的版本&#xff0c;然后就問我&#xff0c;有沒有什么…

python可以做特效嗎_學習mel語言,Python,JavaScript到什么程度才能做一下大型特效,要自已開發插件腳本呢?...

感謝邀請。首先自己要在某一方面要擅長&#xff0c;認準一個定位。比如android是鑰匙做前端應用軟件的&#xff0c;python可以做爬蟲及其人工智能&#xff0c;js做全段網頁&#xff0c;java主要是做后端的1、我們程序員對于開發軟件來說&#xff0c;無論你選擇的是那種語言&…

POJ2513-Colored Sticks

/*思路&#xff1a;類似圖論中“一筆畫”問題&#xff0c;兩根木棒的相連接的端點是一樣的顏色&#xff0c;&#xff08;a,b&#xff09;--(b,c)--(c, d)....方法&#xff1a;trie樹并查集&#xff0c; 利用trie樹建立字符串和某一個節點的映射&#xff0c;并將這些和字符串構成…

php windows共享內存,給PHP開啟shmop擴展實現共享內存

這篇文章主要介紹了關于給PHP開啟shmop擴展實現共享內存&#xff0c;有著一定的參考價值&#xff0c;現在分享給大家&#xff0c;有需要的朋友可以參考一下在項目開發中&#xff0c;想要實現PHP多個進程之間共享數據的功能&#xff0c;讓客戶端連接能夠共享一個狀態&#xff0c…

導入ansys的實體怎么進行parameter_ANSYS在線纜線束設計中的仿真應用

ANSYS采用ANSYS Maxwell、Q3D、Twin Builder等電磁仿真軟件&#xff0c;從線纜線束設計、寄生參數RLCG提取、到系統電磁兼容提供了全面仿真分析。創建模型ANSYS在Maxwell軟件基礎上提出針對用戶定制化的“線纜線束設計工具包”&#xff0c;幫助客戶參數化建立特定幾何模型&…

怎么做95置信區間圖_這種動態的OD圖怎么做?簡單3步快速搞定

之前在視頻號中發過一個單車的出行數據可視化效果。動態展示了某天單車不同時段的運行情況&#xff0c;這種動態的OD可視化效果是如何制作的呢&#xff1f;使用的是kepler.gl進行制作的&#xff0c;其實非常簡單&#xff0c;3步即可快速搞定。一、數據軟件準備1、軟件制作這種動…

php抖音跳轉地址,PHP如何實現解析抖音無水印視頻

問題來源很多時候你在douyin里看到了一個短視頻&#xff0c;想復制下來自己編輯文字來發布&#xff0c;可是視頻里的水印卻是原者的。這個時候你想把水印去掉&#xff0c;你要如何做呢&#xff1f;這里提供PHP實現去除水印的主要方法&#xff0c;其實很簡單。使用方法&#xff…

php 分割二維數組,拆分二維數組 php

把以下數組拆分&#xff1a;{"errcode": 0,"msg": "成功","data": {"list": [{"ticket_no": "1","options": ["周四301","周四302","周四303"],"play_ty…

Dijkstra算法優先隊列實現與Bellman_Ford隊列實現的理解

1 /*2 Dijkstra算法用優先隊列來實現&#xff0c;實現了每一條邊最多遍歷一次。 要知道&#xff0c;我們從隊列頭部找到的都是到3 已經"建好樹"的最短距離以及該節點編號, 并由該節點去更新 樹根 到其他點&#xff08;被更新的節點可以在隊列中4 &#xff0c;也可以是…

php times33,PHP Hash算法:Times33算法代碼實例

最近看書&#xff0c;里面提到了一些Hash算法。比較有印象的是Times33&#xff0c;當時理解不是很透測&#xff0c;今天寫了段程序來驗證了一下。先上代碼&#xff1a;復制代碼 代碼如下:/*** CRC32 Hash function* param $str* return int*/function hash32($str){return crc3…

撿到vivo手機怎么清除賬號_為什么現在買手機,很少會去考慮OPPO和vivo呢?看一下老板怎么說...

不知道大家是否注意到&#xff0c;近年來OPPO和vivo的報道越來越少&#xff0c;而華為、榮耀和小米出現的頻率越來越高。此外&#xff0c;網絡上還有另外一個聲音&#xff0c;一個專業的機友朋友說&#xff0c;寧可選擇小米、OPPO和vivo&#xff0c;為什么熟悉自己手機的人不考…

php分析圖片中水印的位置,關于ThinkPHP打水印及設置水印位置的分析

這篇文章主要介紹了ThinkPHP打水印及設置水印位置的方法,結合實例形式分析了thinkPHP打印與設置水印的相關操作步驟與具體實現技巧,需要的朋友可以參考下本文實例講述了ThinkPHP打水印及設置水印位置的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;最近在用Thin…

華為交換機命令_華為交換機常用命令

華為交換機常用命令&#xff1a;1、display current-configuration 顯示當前配置2、display interface GigabitEthernet 1/1/4 顯示接口信息3、display packet-filter interface GigabitEthernet 1/1/4 顯示接口acl應用信息4、display acl all 顯示所有acl設置 3900系列交換機5…

java中兩種添加監聽器的策略

/*第一種&#xff1a;將事件的處理委托給其他對象&#xff0c;下面的例子是委托給了MyListener&#xff08;implements ActionListener&#xff09;*/ 1 import java.applet.Applet;2 import java.awt.event.*;3 import java.awt.*;4 public class ChangeColor extends Applet{…

php dos命令用不了,windows下如何使用DOS命令強制復制文件

有的時候&#xff0c;我們可能需要替換某些目錄下的一些文件&#xff0c;手動去一個個目錄找的話&#xff0c;就會比較麻煩&#xff0c;這時候&#xff0c;就是我們程序員上場的時候了&#xff0c;程序雖然好寫&#xff0c;但是dos命令并不是每個人都玩的轉的&#xff0c;而且最…

java的棧圖形演示

1 import java.awt.*;2 import javax.swing.*;3 import java.awt.event.*;4 /*5 指示發生了組件定義的動作的語義事件。當特定于組件的動作&#xff08;比如被按下&#xff09;發生時&#xff0c;由組件&#xff08;比如 Button&#xff09;生成此高級別事件。6 事件被傳遞給每…

python播放本地視頻_python opencv 讀取本地視頻文件 修改ffmpeg的方法

Python opencv 讀取視頻的三種情況&#xff1a;情況一&#xff1a;通過攝像頭采集視頻情況二&#xff1a;通過本地視頻文件獲取視頻情況三&#xff1a;通過攝像頭錄制視頻&#xff0c;再讀取錄制的視頻攝像頭采集、本地視頻文件的讀取、寫視頻文件&#xff0c;網上都有代碼。我…

kali里PHP文件502錯誤,解決Linux Kali iptables開放22端口失敗等一系列問題

這篇文章是針對2020年下載安裝的kali系統碰到的關于 iptables開放22端口失敗等一系列問題的解決辦法&#xff0c;如果是其它系統&#xff0c;可以借鑒一下思路。各種報錯&#xff1a;# sudo systemctl start iptablesFailed to start iptables.service: Unit iptables.service …

中綴試轉后綴試及前綴試并計算其結果

1 /*2 參考大神nb的代碼&#xff0c;感覺思路不錯&#xff01;終于搞明白了&#xff01;一開始不明白在計算表達式的時候&#xff0c;利用棧到底做了什么&#xff01;現在感覺我們利用棧就是模擬我們書面上計算表達式&#xff0c;3 將優先級高的運算先計算出來&…

ros如何編譯python文件_Python為ROS編寫一個簡單的發布者和訂閱者

Python為ROS編寫一個簡單的發布者和訂閱者1.創建工作空間1.1建立文件夾hello_rospy,再在該目錄下建立子目錄src,并創建工作空間mkdir -p ~/hello_rospy/srccd ~/hello_rospy/srccatkin_init_workspace1.2 編譯cd ~/hello_rospy/catkin_make1.3設置運行環境echo "source ~/…