This is pretty much the same as David's answer but done using Grassmann algebra. The only real advantage here is a more transparent geometric language. The generation of the two sides are done with ComposeVector commands that generate generic vectors in the space.
The GrassmannCalculus Application is developmental but fairly far along. Anyone interested in exploring Grassmann algebra with it may contact me. djmpark@comcast.net.
In two dimensions:
v1 = {a, b}; v2 = {c, d} Expand[2 Tr[v1^2] + 2 Tr[v2^2] == Tr[(v1 + v2)^2] + Tr[(v1 - v2)^2]]
In three dimensions:
v1 = {a, b, c}; v2 = {d, e, f}; Expand[2 Tr[v1^2] + 2 Tr[v2^2] == Tr[(v1 + v2)^2] + Tr[(v1 - v2)^2]]