A. 比特幣源代碼如何修改可以變成一個新的虛擬幣
改一下名字就行了,狗狗幣就是這麽來的,這東西最主要看你怎麽炒作。
B. 都說虛擬貨幣是開源的,可是代碼在哪呢
你說的那是加密數字貨幣,源代碼子在開源的網站可以查詢。也可以去比特幣基金會的官方網站去查詢比特幣的源代碼。
網路虛擬貨幣大致可以分為
第一類是大家熟悉的游戲幣。在單機游戲時代,主角靠打倒敵人、進賭館贏錢等方式積累貨幣,用這些購買草葯和裝備,但只能在自己的游戲機里使用。那時,玩家之間沒有「市場」。自從互聯網建立起門戶和社區、實現游戲聯網以來,虛擬貨幣便有了「金融市場」,玩家之間可以交易游戲幣。
第二類是門戶網站或者即時通訊工具服務商發行的專用貨幣,用於購買本網站內的服務。使用最廣泛的當屬騰訊公司的Q 幣,可用來購買會員資格、QQ秀等增值服務。
第三類互聯網上的虛擬貨幣,如比特幣(BTC)、福源幣(FTC)、萊特貨幣(LTC)等,比特幣是一種由開源的P2P軟體產生的電子貨幣,也有人將比特幣意譯為「比特金」,是一種網路虛擬貨幣。主要用於互聯網金融投資,也可以作為新式貨幣直接用於生活中使用。
C. 比特幣源代碼哪裡有啊!
這里:https://github.com/bitcoin/bitcoin
D. 比特幣交易平台的源碼
比特幣(BitCoin)是一種P2P形式的虛擬貨幣。點對點的傳輸意味著一個去中心化的支付系
統。比特幣不依靠特定貨幣機構發行,它通過特定演算法的大量計算產生,比特幣經濟使用整個
P2P網路中眾多節點構成的分布式資料庫來確認並記錄所有的交易行為。
比特幣交易通過比特幣交易平台來進行, 目前國內做的比較好的比特幣交易平台有 OKcoin,比特幣中國, 火幣網,796交易網等,每家公司起家的資本都是不一樣的, OKcoin是靠技術起家的,火幣網更注重用戶的體驗效果吧, 不過就專業性來說 OKcoin是相對來說比較好的。
E. 2009年比特幣剛出現時怎麼買
最初獲取比特幣的渠道只有一個「挖礦」比特幣(Bitcoin)的概念最初由中本聰在 2008年11月1日提出,並於2009年1月3日正式誕生。比特幣的源代碼集成了強大的隱私保護功能。該系統旨在公開記錄比特幣交易和其他相關數據,而不披露涉及的個人或團體的身份。相反,比特幣用戶是通過公鑰或數字代碼(有時是匿名句柄或用戶名)來識別的,這些代碼可以將他們識別給其他用戶。 額外的保護措施允許用戶進一步隱藏比特幣的來源和流量。例如,所有比特幣用戶都可以使用一種特殊的計算機程序(稱為混合服務),用一個特定的比特幣單位私下交換另一個相同價值的比特幣單位,從而掩蓋了所有者財產的來源。
拓展資料
1. 比特幣交易 比特幣交易所允許用戶以可變匯率將比特幣單位轉換成法定貨幣,如美元和歐元。許多比特幣交易所還用比特幣單位交換其他加密貨幣,包括不太受歡迎的、不能直接轉換為法定貨幣的替代貨幣。大多數比特幣交易所將每筆交易的價值削減了不到1%。 比特幣交易所確保比特幣市場保持流動性,設定比特幣相對於傳統貨幣的價值,並允許持有者從對比特幣價值波動的投機中獲利。也就是說,比特幣的用戶必須明白,比特幣的價值會受到波動的影響——以前每周都會有50%的波動。這在穩定的法定貨幣中是聞所未聞的。
2.區塊鏈 比特幣的區塊鏈對其功能至關重要。區塊鏈是以前所有比特幣交易的通用分布式賬本,這些交易存儲在一個稱為塊的組中。比特幣軟體網路的每個節點(伺服器群和終端)都由被稱為礦工的個人或團體操作。他們努力生產新的比特幣單位,使比特幣交易被記錄和驗證,並定期創建新的區塊,其中包含與比特幣區塊鏈記錄相同的內容。 由於新的比特幣交易繼續發生,盡管比特幣區塊鏈有限,它將隨著時間增長。只要礦工繼續工作並記錄最近的交易,比特幣區塊鏈將永遠是一個正在進行的工作。換句話說,區塊鏈沒有預定的長度來停止增長。 礦工平均每10分鍾創建一個新的區塊鏈,包括所有以前的事務和一個新的事務塊。每兩周,比特幣的源代碼將根據挖礦能力進行調整,以創建新的區塊鏈,以保持平均10分鍾的創建間隔。如果在過去兩周內采礦能力增加,則很難在未來兩周內創建一個新的區塊鏈。
F. 數字貨幣的開源代碼是什麼
近年來,以比特幣為代表的區塊鏈數字資產風靡全球,國內外金融機構、科技公司、投資公司等參與方投入大量的人力、物力、技術等資源,進行區塊鏈數字資產的研究、開發、設計、測試與推廣。要實現區塊鏈數字資產「四可三不可」的主要特性,可依託安全技術、交易技術、可信保障技術這三個方面的11項技術構建數字資產的核心技術體系。首先,以安全技術保障區塊鏈數字資產的可流通性、可存儲性、可控匿名性、不可偽造性、不可重復交易性與不可抵賴性。數字貨幣安全技術主要包括基礎安全技術、數據安全技術、交易安全技術三個層面。基礎安全技術包括加解密技術與安全晶元技術。加解密技術主要應用於數字資產的幣值生成、保密傳輸、身份驗證等方面,建立完善的加解演算法體系是數字資產體系的核心與基礎,需要由國家密碼管理機構定製與設計。安全晶元技術主要分為終端安全模塊技術和智能卡晶元技術,數字資產可基於終端安全模塊採用移動終端的形式實現交易,終端安全模塊作為安全存儲和加解密運算的載體,能夠為數字資產提供有效的基礎性安全保護。數字資產系統交易平台區塊鏈技術研發數據安全技術包括數據安全傳輸技術與安全存儲技術。數據安全傳輸技術通過密文+MAC/密文+HASH方式傳輸數字資產信息,以確保數據信息的保密性、安全性、不可篡改性;數據安全存儲技術通過加密存儲、訪問控制、安全監測等方式儲存數字貨幣信息,確保數據信息的完整性、保密性、可控性。
交易安全技術包括匿名技術、身份認證技術、防重復交易技術與防偽技術。匿名技術通過盲簽名(包括盲參數簽名、弱盲簽名、強盲簽名等)、零知識證明等方式實現數字資產的可控匿名性;身份認證技術通過認證中心對用戶身份進行驗證,確保數字資產交易者身份的有效性;防重復交易技術通過數字簽名、流水號、時間戳等方式確保數字資產不被重復使用;防偽技術通過加解密、數字簽名、身份認證等方式確保數字資產真實性與交易真實性。其次,以交易技術實現數字資產的在線交易與離線交易功能。數字資產交易技術主要包括在線交易技術與離線交易技術兩個方面。數字資產作為具有法定地位的貨幣,任何單位或個人不得拒收,要求數字資產在線或離線的情況下均可進行交易。在線交易技術通過在線設備交互技術、在線數據傳輸技術與在線交易處理等實現數字資產的在線交易業務;離線交易技術通過離線設備交互技術、離線數據傳輸技術與離線交易處理等實現數字資產的離線交易業務。最後,以可信保障技術為區塊鏈數字資產發行、流通、交易提供安全、可信的應用環境。數字資產可信保障技術主要指可信服務管理技術,基於可信服務管理平台(TSM)保障數字資產安全模塊與應用數據的安全可信,為數字資產參與方提供安全晶元(SE)與應用生命周期管理功能。可信服務管理技術能夠為數字資產提供應用注冊、應用下載、安全認證、鑒別管理、安全評估、可信載入等各項服務,能夠有效確保數字資產系統的安全可信。
什麼是區塊鏈?區塊鏈技術,簡稱BT(Blockchain technology),也被稱之為分布式賬本技術,是一種互聯網資料庫技術,其特點是去中心化、公開透明,讓每個人均可參與資料庫記錄。區塊鏈技術開發區塊鏈技術開發 什麼是區塊鏈系統?區塊鏈系統是一個具備完整性的資料庫系統,寫入系統的數據會自動復制到區塊鏈的節點上面,能實現事務性的數據保存,支持多種行業資料庫的管理開發,結合多種需求來製作。2944.97億美元,漲幅為2.60%。本周共有5個新項目進入TOP100,分別為分別為FST,ZB,WIX,WAX,MXM。8月11日,Bitcoin價格為11523.58美元,較上周上漲3.20%,Ethereum價格為216.09美元,較上周下跌3.86%。本周24h成交額較上周同期上升2.63%;TOP100項目中幣類項目總市值、平均市值漲幅zui大,全球區塊鏈資產TOP100項目分類組成穩定。
G. 請問哪裡有windows平台C++的bitcoin源代碼下載,我想用VC來編譯。
很多朋友都知道如何在linux平台如何編譯比特幣程序,但是,到了windows平台,
就會感覺到無從下手. 其實, 比特幣程序是跨平台的.
你要編譯windows版的比特幣程序,基本上有兩種方法,一種是在linux平台
(推薦ubuntu 13.10)通過交叉編譯的方法來編譯.另外一種,就是直接在windows平台編譯.
我想,你既然要在windows平台使用,我就詳細介紹一下如何在windwows平台編譯比特幣程序.
我的平台:windows7
第一步:安裝變編譯環境QT和MINGW,msys
1、msys是一個在windows平台模擬shell的程序。
下載安裝程序之後,通過安裝管理程序,按安裝以下內容:
From MinGW installation manager -> All packages -> MSYS
選中以下安裝包
msys-base-bin
msys-autoconf-bin
msys-automake-bin
msys-libtool-bin
點 apply changes開始安裝。他會自動下載安裝好。
需要注意的是,確保不要安裝msys-gcc和msys-w32api ,因為這兩個包和我們的編譯系統發生沖突。
很多人出現一些莫名其妙的問題,就是因為這兩個包。
2、安裝 MinGW-builds
下載並解壓縮 i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z 到C盤根目錄 C:\
注意我的目錄結構。你盡量和我一樣。
3、設置PATH環境變數,將C:\mingw32\bin;添加到第一個。
4、在命令行模式下輸入 gc -v 會得到以下內容
c:\gcc -v
Using built-in specs.
COLLECT_GCC=c:\mingw32\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw32/bin/../libexec/gcc/i686-w64-mingw32/4.8.2/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../../../src/gcc-4.8.2/configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32 --with-gxx-include-dir=/mingw32/i686-w64-mingw32/include/c++ --enable-shared --enable-static --disable-multilib --enable-languages=ada,c,c++,fortran,objc,obj-c++,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-sjlj-exceptions --with-dwarf2 --disable-isl-version-check --disable-cloog-version-check --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=i686 --with-tune=generic --with-libiconv --with-system-zlib --with-gmp=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-mpfr=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-mpc=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-isl=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-cloog=/c/mingw482/prerequisites/i686-w64-mingw32-static --enable-cloog-backend=isl --with-pkgversion='i686-posix-dwarf-rev3, Built by MinGW-W64 project' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include' CPPFLAGS= LDFLAGS='-pipe -L/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/lib -L/c/mingw482/prerequisites/i686-zlib-static/lib -L/c/mingw482/prerequisites/i686-w64-mingw32-static/lib -Wl,--large-address-aware'
Thread model: posix
gcc version 4.8.2 (i686-posix-dwarf-rev3, Built by MinGW-W64 project)
至此,你的開發環境已經搭建好了,很簡單吧
第二部分:下載bitcoin引用的外部庫
我們把它們全部放在 C:\deps目錄下
2.1 安裝OpenSSL
進入啟動 MinGw shell 比如目錄:(C:\MinGW\msys\1.0\msys.bat)運行這個msys.bat,就會啟動一個shell環境,提示符是$
輸入命令
cd /c/deps/
tar xvfz openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
Configure no-shared no-dso mingw
make
等待幾分鍾後,就把openssl編譯好了。
2.2 下載Berkeley DB
我們推薦使用 4.8版本
同樣在msys shell環境下輸入以下命令
cd /c/deps/
tar xvfz db-4.8.30.NC.tar.gz
cd db-4.8.30.NC/build_unix
../dist/configure --enable-mingw --enable-cxx --disable-shared --disable-replication
make
等待編譯
2.3 安裝Boost
msys命令:
cd C:\deps\boost_1_55_0\
bootstrap.bat mingw
b2 --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage
2.4 安裝Miniupnpc
cd C:\deps\miniupnpc
mingw32-make -f Makefile.mingw init upnpc-static
msys shell命令
cd /c/deps/protobuf-2.5.0
configure --disable-shared
make
2.6 qrencode:
命令
cd /c/deps/libpng-1.6.10
configure --disable-shared
make
LIBS="../libpng-1.6.10/.libs/libpng16.a ../../mingw32/i686-w64-mingw32/lib/libz.a" \
png_CFLAGS="-I../libpng-1.6.10" \
png_LIBS="-L../libpng-1.6.10/.libs" \
configure --enable-static --disable-shared --without-tools
make
2.7 安裝 Qt 5 庫
下載和解壓縮
在 windows命令行輸入:
set INCLUDE=C:\deps\libpng-1.6.10;C:\deps\openssl-1.0.1g\include
set LIB=C:\deps\libpng-1.6.10\.libs;C:\deps\openssl-1.0.1g
cd C:\Qt\5.2.1
configure.bat -release -opensource -confirm-license -static -make libs -no-sql-sqlite -no-opengl -system-zlib -qt-pcre -no-icu -no-gif -system-libpng -no-libjpeg -no-freetype -no-angle -no-vcproj -openssl-linked -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug
mingw32-make
set PATH=%PATH%;C:\Qt\5.2.1\bin
cd C:\Qt\qttools-opensource-src-5.2.1
qmake qttools.pro
mingw32-make
3. 下載Bitcoin 0.9.1
在msys shell下輸入以下命令行:
cp /c/deps/libpng-1.6.10/.libs/libpng16.a /c/deps/libpng-1.6.10/.libs/libpng.a
cd /c/bitcoin-0.9.1
./autogen.sh
CPPFLAGS="-I/c/deps/boost_1_55_0 \
-I/c/deps/db-4.8.30.NC/build_unix \
-I/c/deps/openssl-1.0.1g/include \
-I/c/deps \
-I/c/deps/protobuf-2.5.0/src \
-I/c/deps/libpng-1.6.10 \
-I/c/deps/qrencode-3.4.3" \
LDFLAGS="-L/c/deps/boost_1_55_0/stage/lib \
-L/c/deps/db-4.8.30.NC/build_unix \
-L/c/deps/openssl-1.0.1g \
-L/c/deps/miniupnpc \
-L/c/deps/protobuf-2.5.0/src/.libs \
-L/c/deps/libpng-1.6.10/.libs \
-L/c/deps/qrencode-3.4.3/.libs" \
./configure \
--disable-upnp-default \
--disable-tests \
--with-qt-incdir=/c/Qt/5.2.1/include \
--with-qt-libdir=/c/Qt/5.2.1/lib \
--with-qt-bindir=/c/Qt/5.2.1/bin \
--with-qt-plugindir=/c/Qt/5.2.1/plugins \
--with-boost-system=mgw48-mt-s-1_55 \
--with-boost-filesystem=mgw48-mt-s-1_55 \
--with-boost-program-options=mgw48-mt-s-1_55 \
--with-boost-thread=mgw48-mt-s-1_55 \
--with-boost-chrono=mgw48-mt-s-1_55 \
--with-protoc-bindir=/c/deps/protobuf-2.5.0/src
make
strip src/bitcoin-cli.exe
strip src/bitcoind.exe
strip src/qt/bitcoin-qt.exe
這樣,你就得到了變異好的 bitcoin-cli.exe和bitcoind.exe ,bitcoin-qt.exe(windows QT圖形界面的錢包軟體)
H. 比特幣能不能「復制」和「粘貼」
比特幣可以復制粘貼,比特幣的源代碼是公開透明的。任何人都可以查看和修改。大部分山寨幣都是吸取了比特幣的經驗,是比特幣的一種創新。有的山寨幣甚至只是修改了比特幣源代碼的數字。但是比特幣先入為主,目前還沒有任何一種數字加密貨幣可以抗衡。
I. 比特幣源碼研讀一:橢圓曲線在比特幣密碼中的加密原理
參加比特幣源碼研讀班後首次寫作,看到前輩black寫的有關密鑰,地址寫的很好了,就選了他沒有寫的橢圓曲線,斗膽寫這一篇。
在密碼學上有兩種加密方式,分別是對稱密鑰加密和非對稱密鑰加密。
對稱加密:加密和解密使用的同樣的密鑰。
非對稱加密:加密和解密是使用的不同的密鑰。
二戰中圖靈破解德軍的恩尼格碼應該就是用的對稱加密,因為他的加密和解密是同一個密鑰。比特幣的加密是非對稱加密,而且用的是破解難度較大的橢圓曲線加密,簡稱ECC。
非對稱加密的通用原理就是用一個難以解決的數學難題做到加密效果,比如RSA加密演算法。RSA加密演算法是用求解一個極大整數的因數的難題做到加密效果的。就是說兩個極大數相乘,得到乘積很容易,但是反過來算數一個極大整數是由哪兩個數乘積算出來的就非常困難。
下面簡要介紹一下橢圓曲線加密演算法ECC。
首先橢圓曲線的通式是這個樣子的:
一般簡化為這個樣子:
()發公式必須吐槽一下,太麻煩了。)
其中
這樣做就排除了帶有奇點的橢圓曲線,可以理解為所有的點都有一條切線。
圖像有幾種,下面列舉幾個:[1]
橢圓曲線其實跟橢圓關系不大,也不像圓錐曲線那樣,是有圓錐的物理模型為基礎的。在計算橢圓曲線的周長時,需要用到橢圓積分,而橢圓曲線的簡化通式:
,周長公式在變換後有一項是這樣的:,平方之後兩者基本一樣。
我們大體了解了橢圓曲線,就會有一個疑問,這個東西怎麼加密的呢?也就是說橢圓曲線是基於怎樣的數學難題呢?在此之前還得了解一些最少必要知識:橢圓曲線加法,離散型橢圓曲線。
橢圓曲線加法
數學家門從普通的代數運算中,抽象出了加群(也叫阿貝爾群或交換群),使得在加群中,實數的演算法和橢圓曲線的演算法得到統一。
數學中的「群」是一個由我們定義了一種二元運算的集合,二元運算我們稱之為「加法」,並用符號「+」來表示。為了讓一個集合G成為群,必須定義加法運算並使之具有以下四個特性:
1. 封閉性:如果a和b是集合G中的元素,那麼(a + b)也是集合G中的元素。
2. 結合律:(a + b) + c = a + (b + c);
3. 存在單位元0,使得a + 0 = 0 + a =a;
4. 每個元素都有逆元,即:對於任意a,存在b,使得a + b = 0.
如果我們增加第5個條件:
5. 交換律: a + b = b + a
那麼,稱這個群為阿貝爾群。[1]
運演算法則:任意取橢圓曲線上兩點P、Q (若P、Q兩點重合,則做P點的切線)做直線交於橢圓曲線的另一點R』,過R』做y軸的平行線交於R。我們規定P+Q=R。(如圖)[2]
特別的,當P和Q重合時,P+Q=P+P=2P,對於共線的三點,P,Q,R』有P+Q+R』=0∞.
這里的0∞不是實數意義的0,而是指的無窮遠點(這里的無窮遠點就不細說了,你可以理解為這個點非常遙遠,遙遠到兩條平行線都在這一點相交了。具體介紹可以看參考文獻[2])。
注意這里的R與R』之間的區別,P+Q=R,R並沒有與P,Q共線,是R』與P,Q共線,不要搞錯了。
法則詳解:
這里的+不是實數中普通的加法,而是從普通加法中抽象出來的加法,他具備普通加法的一些性質,但具體的運演算法則顯然與普通加法不同。
根據這個法則,可以知道橢圓曲線無窮遠點O∞與橢圓曲線上一點P的連線交於P』,過P』作y軸的平行線交於P,所以有無窮遠點 O∞+ P = P 。這樣,無窮遠點 O∞的作用與普通加法中零的作用相當(0+2=2),我們把無窮遠點 O∞ 稱為零元。同時我們把P』稱為P的負元(簡稱,負P;記作,-P)。(參見下圖)
離散型橢圓曲線
上面給出的很好看的橢圓曲線是在實數域上的連續曲線,這個是不能用來加密的,原因我沒有細究,但一定是連續曲線上的運算太簡單。真正用於加密的橢圓曲線是離散型的。要想有一個離散型的橢圓曲線,先得有一個有限域。
域:在抽象代數中,域(Field)之一種可進行加、減、乘、除運算的代數結構。它是從普通實數的運算中抽像出來的。這一點與阿貝爾群很類似。只不過多了乘法,和與乘法相關的分配率。
域有如下性質[3]:
1.在加法和乘法上封閉,即域里的兩個數相加或相乘的結果也在這個域中。
2.加法和乘法符合結合律,交換率,分配率。
3.存在加法單位,也可以叫做零元。即存在元素0,對於有限域內所有的元素a,有a+0=a。
4.存在乘法單位,也可以叫做單位元。即存在元素1,對於有限域內所有的元素a,有1*a=a。
5.存在加法逆元,即對於有限域中所有的元素a,都存在a+(-a)=0.
6.存在乘法逆元,即對於有限域中所有的元素a,都存在a*=0.
在掌握了這些知識後,我們將橢圓曲線離散化。我們給出一個有限域Fp,這個域只有有限個元素。Fp中只有p(p為素數)個元素0,1,2 …… p-2,p-1;
Fp 的加法(a+b)法則是 a+b≡c (mod p);它的意思是同餘,即(a+b)÷p的余數與c÷p的余數相同。
Fp 的乘法(a×b)法則是 a×b≡c (mod p);
Fp 的除法(a÷b)法則是 a/b≡c (mod p);即 a×b∧-1≡c (mod p);(也是一個0到p-1之間的整數,但滿足b×b∧-1≡1 (mod p);
Fp 的單位元是1,零元是 0(這里的0就不是無窮遠點了,而是真正的實數0)。
下面我們就試著把
這條曲線定義在Fp上:
選擇兩個滿足下列條件的小於p(p為素數)的非負整數a、b,且a,b滿足
則滿足下列方程的所有點(x,y),再加上無窮遠點O∞ ,構成一條橢圓曲線。
其中 x,y屬於0到p-1間的整數,並將這條橢圓曲線記為Ep(a,b)。
圖是我手畫的,大家湊合看哈。不得不說,p取7時,別看只有10個點,但計算量還是很大的。
Fp上的橢圓曲線同樣有加法,法則如下:
1. 無窮遠點 O∞是零元,有O∞+ O∞= O∞,O∞+P=P
2. P(x,y)的負元是 (x,-y),有P+(-P)= O∞
3. P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下關系:
x3≡-x1-x2(mod p)
y3≡k(x1-x3)-y1(mod p)
其中若P=Q 則 k=(3+a)/2y1 若P≠Q,則k=(y2-y1)/(x2-x1)
通過這些法則,就可以進行離散型橢圓曲線的計算。
例:根據我畫的圖,(1,1)中的點P(2,4),求2P。
解:把點帶入公式k=(3*x∧2+a)/2y1
有(3*2∧2+1)/2*4=6(mod 7).
(注意,有些小夥伴可能算出13/8,這是不對的,這里是模數算數,就像鍾表一樣,過了12點又回到1點,所以在模為7的世界裡,13=6,8=1).
x=6*6-2-2=4(mod 7)
y=6*(2-4)-4=2 (mod 7)
所以2P的坐標為(2,4)
那橢圓曲線上有什麼難題呢?在模數足夠大的情況下,上面這個計算過程的逆運算就足夠難。
給出如下等式:
K=kG (其中 K,G為Ep(a,b)上的點,k為小於n(n是點G的階)的整數)不難發現,給定k和G,根據加法法則,計算K很容易;但給定K和G,求k就相對困難了。
這就是橢圓曲線加密演算法採用的難題。我們把點G稱為基點(base point),k稱為私鑰,K稱為公鑰。
現在我們描述一個利用橢圓曲線進行加密通信的過程[2]:
1、用戶A選定一條橢圓曲線Ep(a,b),並取橢圓曲線上一點,作為基點G。
2、用戶A選擇一個私鑰k,並生成公鑰K=kG。
3、用戶A將Ep(a,b)和點K,G傳給用戶B。
4、用戶B接到信息後 ,將待傳輸的明文編碼到Ep(a,b)上一點M(編碼方法很多,這里不作討論),並產生一個隨機整數r(r<n)。
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。
200位位的一個數字,那得多大?而且還是素數,所以這種方式是非常安全的。而且再一次交易中,區塊被記錄下來只有10分鍾的時間,也就是說要想解決這個難題必須在10分鍾以內。即便有技術能夠在10分鍾以內破解了現在這個難度的加密演算法,比特幣社區還可以予以反制,提高破解難度。所以比特幣交易很安全,除非自己丟掉密鑰,否則不存在被破解可能。
第一次寫一個完全陌生的數學領域的知識,也許我有錯誤的地方,也許有沒講明白的地方,留言討論吧。總之寫完後對比特比系統的安全性表示很放心。
參考文獻
[1] 橢圓曲線密碼學簡介
[2] 什麼是橢圓曲線加密(ECC)
[3] 域(數學)維基網路
區塊鏈研習社源碼研讀班 高若翔